Null safety

This commit is contained in:
Hillel Coren 2023-09-27 14:30:49 +03:00
parent ea508a9540
commit d89270bcd9
12 changed files with 165 additions and 172 deletions

View File

@ -553,21 +553,21 @@ abstract class CompanyEntity extends Object
bool get enableFirstInvoiceTaxRate => numberOfInvoiceTaxRates >= 1;
bool get enableSecondInvoiceTaxRate => (numberOfInvoiceTaxRates) >= 2;
bool get enableSecondInvoiceTaxRate => numberOfInvoiceTaxRates >= 2;
bool get enableThirdInvoiceTaxRate => (numberOfInvoiceTaxRates) >= 3;
bool get enableThirdInvoiceTaxRate => numberOfInvoiceTaxRates >= 3;
bool get enableFirstItemTaxRate => (numberOfItemTaxRates) >= 1;
bool get enableFirstItemTaxRate => numberOfItemTaxRates >= 1;
bool get enableSecondItemTaxRate => (numberOfItemTaxRates) >= 2;
bool get enableSecondItemTaxRate => numberOfItemTaxRates >= 2;
bool get enableThirdItemTaxRate => (numberOfItemTaxRates) >= 3;
bool get enableThirdItemTaxRate => numberOfItemTaxRates >= 3;
bool get enableFirstExpenseTaxRate => (numberOfExpenseTaxRates) >= 1;
bool get enableFirstExpenseTaxRate => numberOfExpenseTaxRates >= 1;
bool get enableSecondExpenseTaxRate => (numberOfExpenseTaxRates) >= 2;
bool get enableSecondExpenseTaxRate => numberOfExpenseTaxRates >= 2;
bool get enableThirdExpenseTaxRate => (numberOfExpenseTaxRates) >= 3;
bool get enableThirdExpenseTaxRate => numberOfExpenseTaxRates >= 3;
bool get hasInvoiceTaxes => numberOfInvoiceTaxRates > 0;

View File

@ -489,7 +489,7 @@ abstract class PaymentEntity extends Object
return startDate.compareTo(date) <= 0 && endDate!.compareTo(date) >= 0;
}
bool get isOnline => (companyGatewayId).isNotEmpty;
bool get isOnline => companyGatewayId.isNotEmpty;
bool get isCompletedOrPartiallyRefunded => [
kPaymentStatusCompleted,
@ -511,7 +511,7 @@ abstract class PaymentEntity extends Object
return 0;
}
return amount - (refunded);
return amount - refunded;
}
// ignore: unused_element

View File

@ -209,107 +209,106 @@ abstract class ProjectEntity extends Object
}
int compareTo(
ProjectEntity? project,
ProjectEntity project,
String sortField,
bool sortAscending,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String?, ClientEntity?> clientMap) {
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap) {
int response = 0;
final ProjectEntity? projectA = sortAscending ? this : project;
final ProjectEntity? projectB = sortAscending ? project : this;
final ProjectEntity projectA = sortAscending ? this : project;
final ProjectEntity projectB = sortAscending ? project : this;
switch (sortField) {
case ProjectFields.name:
response = projectA!.name
.toLowerCase()
.compareTo(projectB!.name.toLowerCase());
response =
projectA.name.toLowerCase().compareTo(projectB.name.toLowerCase());
break;
case ProjectFields.taskRate:
response = projectA!.taskRate.compareTo(projectB!.taskRate);
response = projectA.taskRate.compareTo(projectB.taskRate);
break;
case ProjectFields.client:
final clientA = clientMap[projectA!.clientId] ?? ClientEntity();
final clientB = clientMap[projectB!.clientId] ?? ClientEntity();
final clientA = clientMap[projectA.clientId] ?? ClientEntity();
final clientB = clientMap[projectB.clientId] ?? ClientEntity();
response = removeDiacritics(clientA.listDisplayName)
.toLowerCase()
.compareTo(removeDiacritics(clientB.listDisplayName).toLowerCase());
break;
case ProjectFields.clientNumber:
final clientA = clientMap[projectA!.clientId] ?? ClientEntity();
final clientB = clientMap[projectB!.clientId] ?? ClientEntity();
final clientA = clientMap[projectA.clientId] ?? ClientEntity();
final clientB = clientMap[projectB.clientId] ?? ClientEntity();
response = clientA.number
.toLowerCase()
.compareTo(clientB.number.toLowerCase());
break;
case ProjectFields.clientIdNumber:
final clientA = clientMap[projectA!.clientId] ?? ClientEntity();
final clientB = clientMap[projectB!.clientId] ?? ClientEntity();
final clientA = clientMap[projectA.clientId] ?? ClientEntity();
final clientB = clientMap[projectB.clientId] ?? ClientEntity();
response = clientA.idNumber
.toLowerCase()
.compareTo(clientB.idNumber.toLowerCase());
break;
case ProjectFields.dueDate:
response = projectA!.dueDate.compareTo(projectB!.dueDate);
response = projectA.dueDate.compareTo(projectB.dueDate);
break;
case ProjectFields.privateNotes:
response = projectA!.privateNotes.compareTo(projectB!.privateNotes);
response = projectA.privateNotes.compareTo(projectB.privateNotes);
break;
case ProjectFields.publicNotes:
response = projectA!.publicNotes.compareTo(projectB!.publicNotes);
response = projectA.publicNotes.compareTo(projectB.publicNotes);
break;
case ProjectFields.budgetedHours:
response = projectA!.budgetedHours.compareTo(projectB!.budgetedHours);
response = projectA.budgetedHours.compareTo(projectB.budgetedHours);
break;
case ProjectFields.totalHours:
response = projectA!.totalHours.compareTo(projectB!.totalHours);
response = projectA.totalHours.compareTo(projectB.totalHours);
break;
case EntityFields.state:
final stateA = EntityState.valueOf(projectA!.entityState);
final stateB = EntityState.valueOf(projectB!.entityState);
final stateA = EntityState.valueOf(projectA.entityState);
final stateB = EntityState.valueOf(projectB.entityState);
response =
stateA.name.toLowerCase().compareTo(stateB.name.toLowerCase());
break;
case EntityFields.createdAt:
response = projectA!.createdAt.compareTo(projectB!.createdAt);
response = projectA.createdAt.compareTo(projectB.createdAt);
break;
case ProjectFields.archivedAt:
response = projectA!.archivedAt.compareTo(projectB!.archivedAt);
response = projectA.archivedAt.compareTo(projectB.archivedAt);
break;
case ProjectFields.updatedAt:
response = projectA!.updatedAt.compareTo(projectB!.updatedAt);
response = projectA.updatedAt.compareTo(projectB.updatedAt);
break;
case EntityFields.assignedTo:
final userA = userMap[projectA!.assignedUserId] ?? UserEntity();
final userB = userMap[projectB!.assignedUserId] ?? UserEntity();
final userA = userMap[projectA.assignedUserId] ?? UserEntity();
final userB = userMap[projectB.assignedUserId] ?? UserEntity();
response = userA.listDisplayName
.toLowerCase()
.compareTo(userB.listDisplayName.toLowerCase());
break;
case EntityFields.createdBy:
final userA = userMap[projectA!.createdUserId] ?? UserEntity();
final userB = userMap[projectB!.createdUserId] ?? UserEntity();
final userA = userMap[projectA.createdUserId] ?? UserEntity();
final userB = userMap[projectB.createdUserId] ?? UserEntity();
response = userA.listDisplayName
.toLowerCase()
.compareTo(userB.listDisplayName.toLowerCase());
break;
case ProjectFields.documents:
response =
projectA!.documents.length.compareTo(projectB!.documents.length);
projectA.documents.length.compareTo(projectB.documents.length);
break;
case ProjectFields.number:
response = (projectA!.number ?? '').compareTo(projectB!.number ?? '');
response = projectA.number.compareTo(projectB.number);
break;
case ProjectFields.customValue1:
response = projectA!.customValue1.compareTo(projectB!.customValue1);
response = projectA.customValue1.compareTo(projectB.customValue1);
break;
case ProjectFields.customValue2:
response = projectA!.customValue2.compareTo(projectB!.customValue2);
response = projectA.customValue2.compareTo(projectB.customValue2);
break;
case ProjectFields.customValue3:
response = projectA!.customValue3.compareTo(projectB!.customValue3);
response = projectA.customValue3.compareTo(projectB.customValue3);
break;
case ProjectFields.customValue4:
response = projectA!.customValue4.compareTo(projectB!.customValue4);
response = projectA.customValue4.compareTo(projectB.customValue4);
break;
default:
print('## ERROR: sort by project.$sortField is not implemented');
@ -317,7 +316,7 @@ abstract class ProjectEntity extends Object
}
if (response == 0) {
response = project!.number.toLowerCase().compareTo(number.toLowerCase());
response = project.number.toLowerCase().compareTo(number.toLowerCase());
}
return response;

View File

@ -188,7 +188,7 @@ abstract class TaskTime implements Built<TaskTime, TaskTimeBuilder> {
}
TaskTime copyWithStartDate(String date, {bool syncDates = false}) {
if ((date ?? '').isEmpty) {
if (date.isEmpty) {
return this;
}
@ -220,7 +220,7 @@ abstract class TaskTime implements Built<TaskTime, TaskTimeBuilder> {
}
TaskTime copyWithEndDate(String date) {
if ((date ?? '').isEmpty) {
if (date.isEmpty) {
return this;
}
@ -666,7 +666,7 @@ abstract class TaskEntity extends Object
if (!isInvoiced && !isRunning) {
if (userCompany.canCreate(EntityType.invoice)) {
actions.add(EntityAction.invoiceTask);
if ((clientId ?? '').isNotEmpty) {
if (clientId.isNotEmpty) {
actions.add(EntityAction.addToInvoice);
}
}
@ -697,114 +697,111 @@ abstract class TaskEntity extends Object
}
int compareTo(
TaskEntity? task,
TaskEntity task,
String sortField,
bool sortAscending,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String?, TaskStatusEntity?> taskStatusMap,
BuiltMap<String, TaskStatusEntity> taskStatusMap,
) {
int response = 0;
final TaskEntity? taskA = sortAscending ? this : task;
final TaskEntity? taskB = sortAscending ? task : this;
final TaskEntity taskA = sortAscending ? this : task;
final TaskEntity taskB = sortAscending ? task : this;
switch (sortField) {
case TaskFields.duration:
case TaskFields.amount:
response =
taskA!.calculateDuration().compareTo(taskB!.calculateDuration());
taskA.calculateDuration().compareTo(taskB.calculateDuration());
break;
case TaskFields.description:
response = taskA!.description.compareTo(taskB!.description);
response = taskA.description.compareTo(taskB.description);
break;
case TaskFields.customValue1:
response = taskA!.customValue1.compareTo(taskB!.customValue1);
response = taskA.customValue1.compareTo(taskB.customValue1);
break;
case TaskFields.customValue2:
response = taskA!.customValue2.compareTo(taskB!.customValue2);
response = taskA.customValue2.compareTo(taskB.customValue2);
break;
case TaskFields.customValue3:
response = taskA!.customValue3.compareTo(taskB!.customValue3);
response = taskA.customValue3.compareTo(taskB.customValue3);
break;
case TaskFields.customValue4:
response = taskA!.customValue4.compareTo(taskB!.customValue4);
response = taskA.customValue4.compareTo(taskB.customValue4);
break;
case TaskFields.clientId:
case TaskFields.client:
final clientA = clientMap[taskA!.clientId] ?? ClientEntity();
final clientB = clientMap[taskB!.clientId] ?? ClientEntity();
final clientA = clientMap[taskA.clientId] ?? ClientEntity();
final clientB = clientMap[taskB.clientId] ?? ClientEntity();
response = removeDiacritics(clientA.listDisplayName)
.toLowerCase()
.compareTo(removeDiacritics(clientB.listDisplayName).toLowerCase());
break;
case TaskFields.projectId:
case TaskFields.project:
final projectA = projectMap[taskA!.projectId] ?? ProjectEntity();
final projectB = projectMap[taskB!.projectId] ?? ProjectEntity();
final projectA = projectMap[taskA.projectId] ?? ProjectEntity();
final projectB = projectMap[taskB.projectId] ?? ProjectEntity();
response = projectA.listDisplayName
.toLowerCase()
.compareTo(projectB.listDisplayName.toLowerCase());
break;
case TaskFields.invoiceId:
final invoiceA = invoiceMap[taskA!.invoiceId] ?? InvoiceEntity();
final invoiceB = invoiceMap[taskB!.invoiceId] ?? InvoiceEntity();
final invoiceA = invoiceMap[taskA.invoiceId] ?? InvoiceEntity();
final invoiceB = invoiceMap[taskB.invoiceId] ?? InvoiceEntity();
response = invoiceA.listDisplayName
.toLowerCase()
.compareTo(invoiceB.listDisplayName.toLowerCase());
break;
case EntityFields.state:
final stateA =
EntityState.valueOf(taskA!.entityState) ?? EntityState.active;
final stateB =
EntityState.valueOf(taskB!.entityState) ?? EntityState.active;
final stateA = EntityState.valueOf(taskA.entityState);
final stateB = EntityState.valueOf(taskB.entityState);
response =
stateA.name.toLowerCase().compareTo(stateB.name.toLowerCase());
break;
case TaskFields.date:
case TaskFields.timeLog:
response = taskA!.timeLog
.toLowerCase()
.compareTo(taskB!.timeLog.toLowerCase());
response =
taskA.timeLog.toLowerCase().compareTo(taskB.timeLog.toLowerCase());
break;
case EntityFields.createdAt:
response = taskA!.createdAt.compareTo(taskB!.createdAt);
response = taskA.createdAt.compareTo(taskB.createdAt);
break;
case TaskFields.archivedAt:
response = taskA!.archivedAt.compareTo(taskB!.archivedAt);
response = taskA.archivedAt.compareTo(taskB.archivedAt);
break;
case TaskFields.updatedAt:
response = taskA!.updatedAt.compareTo(taskB!.updatedAt);
response = taskA.updatedAt.compareTo(taskB.updatedAt);
break;
case TaskFields.documents:
response = taskA!.documents.length.compareTo(taskB!.documents.length);
response = taskA.documents.length.compareTo(taskB.documents.length);
break;
case TaskFields.number:
response = compareNatural(
taskA!.number.toLowerCase(), taskB!.number.toLowerCase());
taskA.number.toLowerCase(), taskB.number.toLowerCase());
break;
case TaskFields.createdBy:
final userA = userMap[taskA!.createdUserId] ?? UserEntity();
final userB = userMap[taskB!.createdUserId] ?? UserEntity();
final userA = userMap[taskA.createdUserId] ?? UserEntity();
final userB = userMap[taskB.createdUserId] ?? UserEntity();
response = userA.fullName
.toLowerCase()
.compareTo(userB.fullName.toLowerCase());
break;
case TaskFields.assignedTo:
final userA = userMap[taskA!.assignedUserId] ?? UserEntity();
final userB = userMap[taskB!.assignedUserId] ?? UserEntity();
final userA = userMap[taskA.assignedUserId] ?? UserEntity();
final userB = userMap[taskB.assignedUserId] ?? UserEntity();
response = userA.fullName
.toLowerCase()
.compareTo(userB.fullName.toLowerCase());
break;
case TaskFields.status:
final taskAStatus = taskA!.isRunning
final taskAStatus = taskA.isRunning
? -1
: taskA.isInvoiced
? 999999
: (taskStatusMap[taskA.statusId]?.statusOrder ?? 0);
final taskBStatus = taskB!.isRunning
final taskBStatus = taskB.isRunning
? -1
: taskB.isInvoiced
? 999999
@ -817,7 +814,7 @@ abstract class TaskEntity extends Object
}
if (response == 0) {
response = task!.number.toLowerCase().compareTo(number.toLowerCase());
response = task.number.toLowerCase().compareTo(number.toLowerCase());
}
return response;

View File

@ -50,8 +50,7 @@ List<String> dropdownCreditSelector(
if (excludedIds.contains(creditId)) {
return false;
}
if (clientId.isNotEmpty &&
credit!.clientId != clientId) {
if (clientId.isNotEmpty && credit!.clientId != clientId) {
return false;
}
if (!clientMap.containsKey(credit!.clientId) ||

View File

@ -199,22 +199,21 @@ List<TaskEntity?> _runningTasks({
}
var memoizedRecentTasks = memo2((
BuiltMap<String?, TaskEntity?> taskMap,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
) =>
_recentTasks(
taskMap: taskMap,
clientMap: clientMap,
));
List<TaskEntity?> _recentTasks({
required BuiltMap<String?, TaskEntity?> taskMap,
BuiltMap<String?, ClientEntity?>? clientMap,
List<TaskEntity> _recentTasks({
required BuiltMap<String, TaskEntity> taskMap,
required BuiltMap<String, ClientEntity> clientMap,
}) {
final tasks = <TaskEntity?>[];
final tasks = <TaskEntity>[];
taskMap.forEach((index, task) {
final client =
clientMap![task!.clientId] ?? ClientEntity(id: task.clientId);
final client = clientMap[task.clientId] ?? ClientEntity(id: task.clientId);
if (task.isNotActive || client.isNotActive) {
// do noting
} else if (!task.isRunning) {

View File

@ -111,19 +111,19 @@ List<InvoiceItemEntity> convertProjectToInvoiceItem({
}
var memoizedDropdownProjectList = memo5(
(BuiltMap<String?, ProjectEntity?> projectMap,
(BuiltMap<String, ProjectEntity> projectMap,
BuiltList<String> projectList,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
String? clientId) =>
dropdownProjectsSelector(
projectMap, projectList, clientMap, userMap, clientId));
List<String> dropdownProjectsSelector(
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltList<String> projectList,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
String? clientId) {
final list = projectList.where((projectId) {
final project = projectMap[projectId];
@ -142,7 +142,7 @@ List<String> dropdownProjectsSelector(
list.sort((projectAId, projectBId) {
final projectA = projectMap[projectAId]!;
final projectB = projectMap[projectBId];
final projectB = projectMap[projectBId]!;
return projectA.compareTo(
projectB, ProjectFields.name, true, userMap, clientMap);
});
@ -151,21 +151,21 @@ List<String> dropdownProjectsSelector(
}
var memoizedFilteredProjectList = memo6((SelectionState selectionState,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltList<String> projectList,
ListUIState projectListState,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap) =>
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap) =>
filteredProjectsSelector(selectionState, projectMap, projectList,
projectListState, clientMap, userMap));
List<String> filteredProjectsSelector(
SelectionState selectionState,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltList<String> projectList,
ListUIState projectListState,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap) {
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap) {
final filterEntityId = selectionState.filterEntityId;
final filterEntityType = selectionState.filterEntityType;
@ -223,7 +223,7 @@ List<String> filteredProjectsSelector(
list.sort((projectAId, projectBId) {
final projectA = projectMap[projectAId]!;
final projectB = projectMap[projectBId];
final projectB = projectMap[projectBId]!;
return projectA.compareTo(projectB, projectListState.sortField,
projectListState.sortAscending, userMap, clientMap);
});

View File

@ -57,8 +57,7 @@ List<String> dropdownQuoteSelector(
if (excludedIds.contains(invoiceId)) {
return false;
}
if (clientId.isNotEmpty &&
invoice!.clientId != clientId) {
if (clientId.isNotEmpty && invoice!.clientId != clientId) {
return false;
}
if (!clientMap.containsKey(invoice!.clientId) ||

View File

@ -244,7 +244,7 @@ List<String> dropdownTasksSelector(
list.sort((taskAId, taskBId) {
final taskA = taskMap[taskAId]!;
final taskB = taskMap[taskBId];
final taskB = taskMap[taskBId]!;
return taskA.compareTo(
taskB,
TaskFields.updatedAt,
@ -261,12 +261,12 @@ List<String> dropdownTasksSelector(
}
var memoizedKanbanTaskList = memo9((SelectionState selectionState,
BuiltMap<String?, TaskEntity?> taskMap,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String?, TaskStatusEntity?> taskStatusMap,
BuiltMap<String, TaskStatusEntity> taskStatusMap,
BuiltList<String> taskList,
ListUIState taskListState) =>
kanbanTasksSelector(selectionState, taskMap, clientMap, userMap, projectMap,
@ -274,12 +274,12 @@ var memoizedKanbanTaskList = memo9((SelectionState selectionState,
List<String> kanbanTasksSelector(
SelectionState selectionState,
BuiltMap<String?, TaskEntity?> taskMap,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String?, TaskStatusEntity?> taskStatusMap,
BuiltMap<String, TaskStatusEntity> taskStatusMap,
BuiltList<String> taskList,
ListUIState taskListState) {
final filterEntityId = selectionState.filterEntityId;
@ -303,7 +303,7 @@ List<String> kanbanTasksSelector(
list.sort((taskAId, taskBId) {
final taskA = taskMap[taskAId]!;
final taskB = taskMap[taskBId];
final taskB = taskMap[taskBId]!;
return taskA.compareTo(
taskB,
taskListState.sortField,
@ -321,12 +321,12 @@ List<String> kanbanTasksSelector(
var memoizedFilteredTaskList = memo9((
SelectionState selectionState,
BuiltMap<String?, TaskEntity?> taskMap,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String?, TaskStatusEntity?> taskStatusMap,
BuiltMap<String, TaskStatusEntity> taskStatusMap,
BuiltList<String> taskList,
ListUIState taskListState,
) =>
@ -344,12 +344,12 @@ var memoizedFilteredTaskList = memo9((
List<String> filteredTasksSelector(
SelectionState selectionState,
BuiltMap<String?, TaskEntity?> taskMap,
BuiltMap<String?, ClientEntity?> clientMap,
BuiltMap<String?, UserEntity?> userMap,
BuiltMap<String?, ProjectEntity?> projectMap,
BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String?, TaskStatusEntity?> taskStatusMap,
BuiltMap<String, TaskStatusEntity> taskStatusMap,
BuiltList<String> taskList,
ListUIState taskListState) {
final filterEntityId = selectionState.filterEntityId;
@ -426,7 +426,7 @@ List<String> filteredTasksSelector(
list.sort((taskAId, taskBId) {
final taskA = taskMap[taskAId]!;
final taskB = taskMap[taskBId];
final taskB = taskMap[taskBId]!;
return taskA.compareTo(
taskB,
taskListState.sortField,

View File

@ -119,7 +119,7 @@ class InvoiceSidebar extends StatelessWidget {
itemCount: upcomingInvoices.length,
itemBuilder: (BuildContext context, int index) {
return InvoiceListItem(
invoice: upcomingInvoices[index],
invoice: upcomingInvoices[index]!,
showSelected: false,
);
},
@ -133,7 +133,7 @@ class InvoiceSidebar extends StatelessWidget {
itemCount: pastDueInvoices.length,
itemBuilder: (BuildContext context, int index) {
return InvoiceListItem(
invoice: pastDueInvoices[index],
invoice: pastDueInvoices[index]!,
showSelected: false,
);
},

View File

@ -28,7 +28,7 @@ class InvoiceListItem extends StatelessWidget {
this.showSelected = true,
});
final InvoiceEntity? invoice;
final InvoiceEntity invoice;
final String? filter;
final bool showCheckbox;
final bool isChecked;
@ -39,42 +39,42 @@ class InvoiceListItem extends StatelessWidget {
Widget build(BuildContext context) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final client = state.clientState.get(invoice!.clientId);
final client = state.clientState.get(invoice.clientId);
final uiState = state.uiState;
final invoiceUIState = uiState.invoiceUIState;
final textStyle = TextStyle(fontSize: 16);
final localization = AppLocalization.of(context)!;
final filterMatch = filter != null && filter!.isNotEmpty
? (invoice!.matchesFilterValue(filter) ??
? (invoice.matchesFilterValue(filter) ??
client!.matchesFilterValue(filter))
: null;
final statusLabel =
localization.lookup(kInvoiceStatuses[invoice!.calculatedStatusId]);
localization.lookup(kInvoiceStatuses[invoice.calculatedStatusId]);
final statusColor = InvoiceStatusColors(state.prefState.colorThemeModel)
.colors[invoice!.calculatedStatusId];
.colors[invoice.calculatedStatusId];
final textColor = Theme.of(context).textTheme.bodyLarge!.color;
String subtitle = '';
if (invoice!.date.isNotEmpty) {
subtitle = formatDate(invoice!.date, context);
if (invoice.date.isNotEmpty) {
subtitle = formatDate(invoice.date, context);
}
if (invoice!.partialDueDate.isNotEmpty && invoice!.partial != 0) {
if (invoice.partialDueDate.isNotEmpty && invoice.partial != 0) {
if (subtitle.isNotEmpty) {
subtitle += '';
}
subtitle += formatDate(invoice!.partialDueDate, context);
} else if (invoice!.dueDate.isNotEmpty) {
subtitle += formatDate(invoice.partialDueDate, context);
} else if (invoice.dueDate.isNotEmpty) {
if (subtitle.isNotEmpty) {
subtitle += '';
}
subtitle += formatDate(invoice!.dueDate, context);
subtitle += formatDate(invoice.dueDate, context);
}
return DismissibleEntity(
isSelected: isDesktop(context) &&
showSelected &&
invoice!.id ==
invoice.id ==
(uiState.isEditing
? invoiceUIState.editing!.id
: invoiceUIState.selectedId),
@ -88,12 +88,12 @@ class InvoiceListItem extends StatelessWidget {
onTap: () => onTap != null
? onTap!()
: selectEntity(
entity: invoice!,
entity: invoice,
forceView: !showCheckbox,
),
onLongPress: () => onTap != null
? null
: selectEntity(entity: invoice!, longPress: true),
: selectEntity(entity: invoice, longPress: true),
child: Padding(
padding: const EdgeInsets.only(
left: 10,
@ -118,7 +118,7 @@ class InvoiceListItem extends StatelessWidget {
),
)
: ActionMenuButton(
entityActions: invoice!.getActions(
entityActions: invoice.getActions(
userCompany: state.userCompany,
client: client,
includeEdit: true,
@ -134,13 +134,13 @@ class InvoiceListItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
(invoice!.number ?? '').isEmpty
(invoice.number ?? '').isEmpty
? localization.pending
: invoice!.number,
: invoice.number,
style: textStyle,
overflow: TextOverflow.ellipsis,
),
if (!invoice!.isActive) EntityStateLabel(invoice)
if (!invoice.isActive) EntityStateLabel(invoice)
],
),
),
@ -151,7 +151,7 @@ class InvoiceListItem extends StatelessWidget {
children: <Widget>[
Text(
client!.displayName +
(invoice!.documents.isNotEmpty
(invoice.documents.isNotEmpty
? ' 📎'
: ''),
style: textStyle),
@ -173,9 +173,9 @@ class InvoiceListItem extends StatelessWidget {
SizedBox(width: 10),
Text(
formatNumber(
invoice!.balance != 0
? invoice!.balance
: invoice!.amount,
invoice.balance != 0
? invoice.balance
: invoice.amount,
context,
clientId: client.id)!,
style: textStyle,
@ -191,10 +191,10 @@ class InvoiceListItem extends StatelessWidget {
onTap: () => onTap != null
? onTap!()
: selectEntity(
entity: invoice!, forceView: !showCheckbox),
entity: invoice, forceView: !showCheckbox),
onLongPress: () => onTap != null
? null
: selectEntity(entity: invoice!, longPress: true),
: selectEntity(entity: invoice, longPress: true),
leading: showCheckbox
? IgnorePointer(
child: Checkbox(
@ -221,11 +221,11 @@ class InvoiceListItem extends StatelessWidget {
SizedBox(width: 4),
Text(
formatNumber(
invoice!.balance != 0
? invoice!.balance
: invoice!.amount,
invoice.balance != 0
? invoice.balance
: invoice.amount,
context,
clientId: invoice!.clientId)!,
clientId: invoice.clientId)!,
style: Theme.of(context).textTheme.titleMedium),
],
),
@ -237,13 +237,13 @@ class InvoiceListItem extends StatelessWidget {
children: <Widget>[
Expanded(
child: filterMatch == null
? Text((((invoice!.number ?? '').isEmpty
? Text((((invoice.number ?? '').isEmpty
? localization.pending
: invoice!.number) +
: invoice.number) +
'' +
formatDate(
invoice!.primaryDate, context) +
(invoice!.documents.isNotEmpty
invoice.primaryDate, context) +
(invoice.documents.isNotEmpty
? ' 📎'
: ''))
.trim())
@ -256,7 +256,7 @@ class InvoiceListItem extends StatelessWidget {
Text(statusLabel!,
style: TextStyle(
color:
!invoice!.isSent ? textColor : statusColor,
!invoice.isSent ? textColor : statusColor,
)),
],
),

View File

@ -581,7 +581,7 @@ class _MatchDepositsState extends State<_MatchDeposits> {
separatorBuilder: (context, index) => ListDivider(),
itemCount: _invoices.length,
itemBuilder: (BuildContext context, int index) {
final invoice = _invoices[index];
final invoice = _invoices[index]!;
return InvoiceListItem(
invoice: invoice,
showCheckbox: true,