tin-spa 20.2.2 → 20.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/tin-spa.mjs +116 -84
- package/fesm2022/tin-spa.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/package.json +1 -1
package/fesm2022/tin-spa.mjs
CHANGED
|
@@ -467,6 +467,14 @@ class Core {
|
|
|
467
467
|
switch (field.type) {
|
|
468
468
|
case 'text':
|
|
469
469
|
return '';
|
|
470
|
+
case 'text-area': // Changed: Added text-area to return empty string
|
|
471
|
+
return '';
|
|
472
|
+
case 'text-single': // Changed: Added text-single to return empty string
|
|
473
|
+
return null;
|
|
474
|
+
case 'text-multi': // Changed: Added text-multi to return empty string
|
|
475
|
+
return '';
|
|
476
|
+
case 'text-mask': // Changed: Added text-mask to return empty string
|
|
477
|
+
return '';
|
|
470
478
|
case 'money':
|
|
471
479
|
return 0;
|
|
472
480
|
case 'number':
|
|
@@ -1531,10 +1539,10 @@ class DataServiceLib {
|
|
|
1531
1539
|
{ name: 'activeStatus', alias: 'Active Status', type: 'select', loadAction: { url: 'employees/list/active-status' } },
|
|
1532
1540
|
{ name: 'passportNumber', type: 'text', alias: 'Passport Number' },
|
|
1533
1541
|
{ name: 'userName', type: 'select', alias: 'User', loadAction: { url: 'user/list/x' }, optionDisplay: 'name', optionValue: 'value', nullable: true, infoMessage: 'Related user account' },
|
|
1534
|
-
{ name: 'address', type: 'text', rows: 2, span: true },
|
|
1542
|
+
{ name: 'address', type: 'text-area', rows: 2, span: true },
|
|
1535
1543
|
{ name: 'phone', type: 'text' },
|
|
1536
1544
|
{ name: 'email', type: 'text' },
|
|
1537
|
-
{ name: 'note', type: 'text', rows: 2, span: true },
|
|
1545
|
+
{ name: 'note', type: 'text-area', rows: 2, span: true },
|
|
1538
1546
|
],
|
|
1539
1547
|
loadAction: { url: 'employees/id' },
|
|
1540
1548
|
heroField: 'employeeID',
|
|
@@ -1692,8 +1700,8 @@ class DataServiceLib {
|
|
|
1692
1700
|
{ name: 'phone', type: 'text' },
|
|
1693
1701
|
{ name: 'contactPerson', type: 'text' },
|
|
1694
1702
|
{ name: 'email', type: 'text' },
|
|
1695
|
-
{ name: 'address', type: 'text', rows: 2, span: true },
|
|
1696
|
-
{ name: 'customerTenantID', alias: 'Customer Tenant', type: 'text', loadAction: { url: 'tenants/list/x' }, nullable: true },
|
|
1703
|
+
{ name: 'address', type: 'text-area', rows: 2, span: true },
|
|
1704
|
+
{ name: 'customerTenantID', alias: 'Customer Tenant', type: 'text-single', loadAction: { url: 'tenants/list/x' }, nullable: true },
|
|
1697
1705
|
],
|
|
1698
1706
|
loadAction: { url: 'customers/id' },
|
|
1699
1707
|
heroField: 'customerID',
|
|
@@ -1749,7 +1757,7 @@ class DataServiceLib {
|
|
|
1749
1757
|
{ name: 'phone', type: 'text' },
|
|
1750
1758
|
{ name: 'contactPerson', type: 'text' },
|
|
1751
1759
|
{ name: 'email', type: 'text' },
|
|
1752
|
-
{ name: 'address', type: 'text', rows: 2, span: true },
|
|
1760
|
+
{ name: 'address', type: 'text-area', rows: 2, span: true },
|
|
1753
1761
|
],
|
|
1754
1762
|
loadAction: { url: 'suppliers/id' },
|
|
1755
1763
|
heroField: 'supplierID',
|
|
@@ -1806,7 +1814,7 @@ class DataServiceLib {
|
|
|
1806
1814
|
fields: [
|
|
1807
1815
|
{ name: 'levelName', type: 'text', readonly: true, alias: 'Level' },
|
|
1808
1816
|
{ name: 'statusName', type: 'text', readonly: true, alias: 'Status' },
|
|
1809
|
-
{ name: 'comments', type: 'text', readonly: true, span: true, rows: 3, copyContent: true },
|
|
1817
|
+
{ name: 'comments', type: 'text-area', readonly: true, span: true, rows: 3, copyContent: true },
|
|
1810
1818
|
],
|
|
1811
1819
|
includeAudit: true
|
|
1812
1820
|
};
|
|
@@ -1845,7 +1853,7 @@ class DataServiceLib {
|
|
|
1845
1853
|
fields: [
|
|
1846
1854
|
{ name: 'blank', type: 'blank', span: true },
|
|
1847
1855
|
{ name: 'statusName', type: 'label', alias: 'Status', span: true },
|
|
1848
|
-
{ name: 'message', type: 'text', required: true, span: true, rows: 3 },
|
|
1856
|
+
{ name: 'message', type: 'text-area', required: true, span: true, rows: 3 },
|
|
1849
1857
|
],
|
|
1850
1858
|
loadAction: { url: 'approvals/id' },
|
|
1851
1859
|
heroField: 'approvalID'
|
|
@@ -1856,7 +1864,7 @@ class DataServiceLib {
|
|
|
1856
1864
|
fixedTitle: true,
|
|
1857
1865
|
fields: [
|
|
1858
1866
|
{
|
|
1859
|
-
name: 'comments', type: 'text', required: false, span: true, rows: 3,
|
|
1867
|
+
name: 'comments', type: 'text-area', required: false, span: true, rows: 3,
|
|
1860
1868
|
infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.'
|
|
1861
1869
|
}
|
|
1862
1870
|
]
|
|
@@ -1866,7 +1874,7 @@ class DataServiceLib {
|
|
|
1866
1874
|
...this.approvalActionFormConfig,
|
|
1867
1875
|
fields: [
|
|
1868
1876
|
{
|
|
1869
|
-
name: 'comments', type: 'text', required: false, span: true, rows: 3,
|
|
1877
|
+
name: 'comments', type: 'text-area', required: false, span: true, rows: 3,
|
|
1870
1878
|
infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.'
|
|
1871
1879
|
}
|
|
1872
1880
|
],
|
|
@@ -1880,7 +1888,7 @@ class DataServiceLib {
|
|
|
1880
1888
|
formConfig: { ...this.approvalActionFormConfig,
|
|
1881
1889
|
fields: [
|
|
1882
1890
|
{
|
|
1883
|
-
name: 'comments', type: 'text', required: true, span: true, rows: 3,
|
|
1891
|
+
name: 'comments', type: 'text-area', required: true, span: true, rows: 3,
|
|
1884
1892
|
infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.',
|
|
1885
1893
|
hint: 'Decline comment is required !'
|
|
1886
1894
|
}
|
|
@@ -3140,6 +3148,7 @@ class GeneralService {
|
|
|
3140
3148
|
//--------------------------SubCategories-------------------------
|
|
3141
3149
|
this.subCategoryFormConfig = {
|
|
3142
3150
|
title: 'Sub Category',
|
|
3151
|
+
fixedTitle: true,
|
|
3143
3152
|
includeAudit: true,
|
|
3144
3153
|
fields: [
|
|
3145
3154
|
{ name: 'name', type: 'text', required: true, alias: 'Name' },
|
|
@@ -3589,14 +3598,25 @@ class InventoryService {
|
|
|
3589
3598
|
includeAudit: true,
|
|
3590
3599
|
fields: [
|
|
3591
3600
|
{ name: 'receiptInfo', type: 'section', alias: 'Receipt Information' },
|
|
3592
|
-
{ name: '
|
|
3593
|
-
{ name: 'poNumber', type: 'text', alias: 'PO Number', hideOnCreate: true, section: 'receiptInfo', hiddenCondition: (row) => !row.purchaseOrderID, infoMessage: 'Linked purchase order if receiving against a PO' }, // Changed: Hide PO number if no PO linked, added info message
|
|
3601
|
+
{ name: 'receiptDate', type: 'date', required: true, alias: 'Receipt Date', section: 'receiptInfo', infoMessage: 'Date goods were received' },
|
|
3594
3602
|
{ name: 'supplierID', type: 'select', required: true, alias: 'Supplier', section: 'receiptInfo',
|
|
3595
3603
|
loadAction: { url: 'suppliers/list/x' }, detailsConfig: this.dataService.supplierDetailsConfig, infoMessage: 'Supplier providing the goods' // Changed: Added info message
|
|
3596
3604
|
},
|
|
3597
|
-
{ name: 'receiptDate', type: 'date', required: true, alias: 'Receipt Date', section: 'receiptInfo', infoMessage: 'Date goods were received' }, // Changed: Added info message
|
|
3598
3605
|
{ name: 'paymentType', type: 'select', required: true, alias: 'Payment Type', section: 'receiptInfo', options: this.paymentTypeOptions, defaultFirstValue: true, infoMessage: 'Payment method used for this purchase' }, // Changed: Default payment type to Cash (value: 0), added info message
|
|
3599
3606
|
{ name: 'supplierInvoiceNumber', type: 'text', alias: 'Supplier Invoice #', section: 'receiptInfo', infoMessage: 'Invoice number from supplier' }, // Changed: Added info message
|
|
3607
|
+
{ name: 'receiptNumber', type: 'text', alias: 'Receipt Number', readonly: true, hideOnCreate: true, section: 'receiptInfo', infoMessage: 'Auto-generated unique receipt identifier' }, // Changed: Added info message
|
|
3608
|
+
{ name: 'poNumber', type: 'text', alias: 'PO Number', hideOnCreate: true, section: 'receiptInfo', hiddenCondition: (row) => !row.purchaseOrderID, infoMessage: 'Linked purchase order if receiving against a PO' },
|
|
3609
|
+
{ name: 'multipleProducts', type: 'checkbox', alias: 'Multiple Products', defaultValue: false, hideOnExists: true, infoMessage: 'Check this box if you want to add multiple products to this receipt' },
|
|
3610
|
+
{ name: 'quickPurchaseItem', type: 'section', alias: 'Quick Purchase Item', hiddenCondition: x => x.multipleProducts === true || x.inventoryReceiptID },
|
|
3611
|
+
{ name: 'productID', type: 'select', required: true, alias: 'Product', section: 'quickPurchaseItem', span: true, loadAction: { url: 'products/list/x' }, hiddenCondition: x => x.multipleProducts === true,
|
|
3612
|
+
onSelectChange: (selectedProductId, formData, option) => {
|
|
3613
|
+
if (option && option.costPrice) {
|
|
3614
|
+
formData.unitCost = option.costPrice;
|
|
3615
|
+
}
|
|
3616
|
+
},
|
|
3617
|
+
detailsConfig: this.productDetailsConfig, infoMessage: 'Product being purchased' },
|
|
3618
|
+
{ name: 'quantity', type: 'number', required: true, alias: 'Quantity', section: 'quickPurchaseItem', hiddenCondition: x => x.multipleProducts === true, infoMessage: 'Number of units purchased' },
|
|
3619
|
+
{ name: 'unitCost', type: 'money', required: true, alias: 'Unit Cost', section: 'quickPurchaseItem', hiddenCondition: x => x.multipleProducts === true, infoMessage: 'Cost per unit' },
|
|
3600
3620
|
{ name: 'totals', type: 'section', alias: 'Totals', hideOnCreate: true, collapsed: true }, // Changed: Hide totals section on create, collapse when shown on edit
|
|
3601
3621
|
{ name: 'totalAmount', type: 'money', alias: 'Total Amount', readonly: true, section: 'totals', infoMessage: 'Total value of all items' }, // Changed: Added info message
|
|
3602
3622
|
{ name: 'additionalInfo', type: 'section', alias: 'Additional Information', collapsed: true },
|
|
@@ -3629,7 +3649,7 @@ class InventoryService {
|
|
|
3629
3649
|
buttons: [this.inventoryReceiptEditButton, this.inventoryReceiptCompleteButton] // Changed: Updated button reference
|
|
3630
3650
|
};
|
|
3631
3651
|
this.inventoryReceiptViewButton = { name: 'view', dialog: true, detailsConfig: this.inventoryReceiptDetailsConfig };
|
|
3632
|
-
this.inventoryQuickPurchaseButton = { name: 'create', display: 'Quick Purchase', dialog: true, action: { url: 'inventoryreceipts?action=create', method: 'post' },
|
|
3652
|
+
this.inventoryQuickPurchaseButton = { name: 'create', display: 'Quick Purchase', dialog: true, action: { url: 'inventoryreceipts?action=create', method: 'post' }, };
|
|
3633
3653
|
this.inventoryReceiptsTableConfig = {
|
|
3634
3654
|
showFilter: true,
|
|
3635
3655
|
flatButtons: true,
|
|
@@ -3701,8 +3721,7 @@ class InventoryService {
|
|
|
3701
3721
|
fields: [
|
|
3702
3722
|
{ name: 'orderInfo', type: 'section', alias: 'Order Information' },
|
|
3703
3723
|
{ name: 'orderNumber', type: 'text', alias: 'Order #', readonly: true, section: 'orderInfo' },
|
|
3704
|
-
{ name: 'customerID', type: 'select', alias: 'Customer', section: 'orderInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig },
|
|
3705
|
-
{ name: 'customerName', type: 'text', alias: 'Walk-in Customer Name', section: 'orderInfo' },
|
|
3724
|
+
{ name: 'customerID', type: 'select', required: true, alias: 'Customer', section: 'orderInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig },
|
|
3706
3725
|
{ name: 'orderDate', type: 'date', required: true, alias: 'Order Date', section: 'orderInfo' },
|
|
3707
3726
|
{ name: 'requiredDate', type: 'date', alias: 'Required Date', section: 'orderInfo' },
|
|
3708
3727
|
{ name: 'quickProcess', type: 'section', alias: 'Quick Processing' },
|
|
@@ -3799,58 +3818,6 @@ class InventoryService {
|
|
|
3799
3818
|
loadAction: { url: 'inventoryitems/all/x' },
|
|
3800
3819
|
formConfig: this.inventoryItemFormConfig
|
|
3801
3820
|
};
|
|
3802
|
-
//--------------------------Inventory Stock (Grouped by Product)-------------------------
|
|
3803
|
-
// Changed: Reuse existing inventoryItemsTableConfig with product criteria filter
|
|
3804
|
-
this.inventoryStockItemsTableConfig = {
|
|
3805
|
-
...this.inventoryItemsTableConfig,
|
|
3806
|
-
tabTitle: 'Stock Items',
|
|
3807
|
-
showFilter: false,
|
|
3808
|
-
elevation: 'none',
|
|
3809
|
-
flatButtons: true,
|
|
3810
|
-
buttons: [],
|
|
3811
|
-
loadAction: { url: 'inventoryitems/stock/x' }, loadCriteria: 'product', loadIDField: 'productID'
|
|
3812
|
-
};
|
|
3813
|
-
// Changed: Reuse product form config, filter to show only Product Information section fields
|
|
3814
|
-
this.inventoryStockProductFormConfig = {
|
|
3815
|
-
...this.productFormConfig,
|
|
3816
|
-
security: { allow: [this.dataService.capInventoryStock] },
|
|
3817
|
-
fields: this.productFormConfig.fields.filter(f => f.section === 'productInfo' || f.name === 'productInfo').map(f => ({ ...f, readonly: true })),
|
|
3818
|
-
loadAction: { url: 'products/id' }
|
|
3819
|
-
};
|
|
3820
|
-
// Changed: Details config reuses simplified product form and inventory items table
|
|
3821
|
-
this.inventoryStockDetailsConfig = {
|
|
3822
|
-
formConfig: this.inventoryStockProductFormConfig,
|
|
3823
|
-
tableConfigs: [this.inventoryStockItemsTableConfig],
|
|
3824
|
-
heroField: 'productID',
|
|
3825
|
-
buttons: []
|
|
3826
|
-
};
|
|
3827
|
-
// Inventory stock summary tiles
|
|
3828
|
-
this.inventoryStockTileConfig = {
|
|
3829
|
-
clickable: true,
|
|
3830
|
-
tiles: [
|
|
3831
|
-
{ name: 'totalProducts', alias: 'Total Products', color: '#2196F3', info: 'Total number of products in inventory', action: { url: 'inventoryitems/stock/all' } },
|
|
3832
|
-
{ name: 'lowStockProducts', alias: 'Low Stock', color: '#FFC107', info: 'Products below minimum quantity', action: { url: 'inventoryitems/stock/lowstock' } },
|
|
3833
|
-
{ name: 'outOfStockProducts', alias: 'Out of Stock', color: '#F44336', info: 'Products with zero quantity', action: { url: 'inventoryitems/stock/outofstock' } },
|
|
3834
|
-
{ name: 'serializedProducts', alias: 'Serialized Products', color: '#9C27B0', info: 'Number of products with serial tracking', action: { url: 'inventoryitems/stock/serialized' } },
|
|
3835
|
-
],
|
|
3836
|
-
loadAction: { url: 'inventoryitems/stock/summary' }
|
|
3837
|
-
};
|
|
3838
|
-
// Changed: Table config for inventory stock grouped by product
|
|
3839
|
-
this.inventoryStockTableConfig = {
|
|
3840
|
-
showFilter: true,
|
|
3841
|
-
flatButtons: true,
|
|
3842
|
-
minColumns: ['productName', 'totalQuantity'],
|
|
3843
|
-
columns: [
|
|
3844
|
-
{ name: 'productName', type: 'button', alias: 'Product', detailsConfig: this.inventoryStockDetailsConfig },
|
|
3845
|
-
{ name: 'totalQuantity', type: 'number', alias: 'Total Stock', icon: { name: 'warning', color: 'orange', condition: (x) => x.isLowInventory } }
|
|
3846
|
-
],
|
|
3847
|
-
buttons: [
|
|
3848
|
-
{ name: 'view', dialog: true, detailsConfig: this.inventoryStockDetailsConfig }
|
|
3849
|
-
],
|
|
3850
|
-
loadAction: { url: 'inventoryitems/stock/all' },
|
|
3851
|
-
formConfig: this.productFormConfig,
|
|
3852
|
-
tileConfig: this.inventoryStockTileConfig
|
|
3853
|
-
};
|
|
3854
3821
|
//--------------------------Inventory Adjustments-------------------------
|
|
3855
3822
|
this.inventoryAdjustmentFormConfig = {
|
|
3856
3823
|
security: { allow: [this.dataService.capInventoryAdjustments] },
|
|
@@ -3990,13 +3957,22 @@ class InventoryService {
|
|
|
3990
3957
|
multiColumn: true,
|
|
3991
3958
|
includeAudit: true,
|
|
3992
3959
|
fields: [
|
|
3993
|
-
{ name: 'saleInfo', type: 'section', alias: 'Sale Information' },
|
|
3994
|
-
{ name: 'saleNumber', type: 'text', alias: 'Sale #', readonly: true, section: 'saleInfo', hideOnCreate: true, infoMessage: 'Unique identifier for this sale' },
|
|
3995
|
-
{ name: 'saleType', type: 'select', required: true, alias: 'Sale Type', section: 'saleInfo', options: [{ name: 'Quick Sale', value: 0 }, { name: 'From Order', value: 1 }], defaultFirstValue: true, infoMessage: 'Select if this is a quick sale or created from an order' },
|
|
3996
|
-
{ name: 'customerID', type: 'select', alias: 'Customer', section: 'saleInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig, infoMessage: 'Select an existing customer or leave blank for walk-in' },
|
|
3997
|
-
{ name: 'customerName', type: 'text', alias: 'Walk-in Customer Name', section: 'saleInfo', hiddenCondition: x => x.customerID != null, infoMessage: 'Name of walk-in customer (shown when no customer is selected)' },
|
|
3960
|
+
{ name: 'saleInfo', type: 'section', alias: 'Sale Information' }, // Changed: Hide when single product mode or when editing existing sale
|
|
3998
3961
|
{ name: 'saleDate', type: 'date', required: true, alias: 'Sale Date', section: 'saleInfo', infoMessage: 'Date when the sale was completed' },
|
|
3999
|
-
{ name: '
|
|
3962
|
+
{ name: 'customerID', type: 'select', required: true, alias: 'Customer', section: 'saleInfo', loadAction: { url: 'customers/list/x' }, detailsConfig: this.dataService.customerDetailsConfig },
|
|
3963
|
+
{ name: 'multipleProducts', type: 'checkbox', alias: 'Multiple Products', defaultValue: false, hideOnExists: true, infoMessage: 'Check this box if you want to add multiple products to this sale' }, // Changed: Added checkbox for multiple products mode
|
|
3964
|
+
{ name: 'saleType', type: 'select', required: true, alias: 'Sale Type', section: 'saleInfo', options: [{ name: 'Quick Sale', value: 0 }, { name: 'From Order', value: 1 }], defaultFirstValue: true, hideOnCreate: true, infoMessage: 'Select if this is a quick sale or created from an order' },
|
|
3965
|
+
{ name: 'quickSaleItem', type: 'section', alias: 'Quick Sale Item', hiddenCondition: x => x.multipleProducts === true || x.saleID }, // Changed: Section for single product entry
|
|
3966
|
+
{ name: 'productID', type: 'select', required: true, alias: 'Product', section: 'quickSaleItem', span: true, loadAction: { url: 'products/list/x' }, hiddenCondition: x => x.multipleProducts === true, // Changed: Product selection for quick sale
|
|
3967
|
+
onSelectChange: (selectedProductId, formData, option) => {
|
|
3968
|
+
if (option && option.sellingPrice) {
|
|
3969
|
+
formData.unitPrice = option.sellingPrice; // Changed: Auto-populate unitPrice with product's sellingPrice
|
|
3970
|
+
}
|
|
3971
|
+
}
|
|
3972
|
+
},
|
|
3973
|
+
{ name: 'quantity', type: 'number', required: true, alias: 'Quantity', section: 'quickSaleItem', defaultValue: 1, hiddenCondition: x => x.multipleProducts === true, infoMessage: 'Quantity of the product' }, // Changed: Quantity field for quick sale
|
|
3974
|
+
{ name: 'unitPrice', type: 'money', required: true, alias: 'Unit Price', section: 'quickSaleItem', hiddenCondition: x => x.multipleProducts === true, infoMessage: 'Price per unit' }, // Changed: Unit price field for quick sale
|
|
3975
|
+
{ name: 'paymentInfo', type: 'section', alias: 'Payment Information', collapsedCondition: x => x.saleID },
|
|
4000
3976
|
{ name: 'paymentMethod', type: 'select', required: true, alias: 'Payment Method', section: 'paymentInfo', options: [{ name: 'Cash', value: 0 }, { name: 'Bank Transfer', value: 1 }, { name: 'Mobile Money', value: 2 }, { name: 'Card', value: 3 }, { name: 'Credit', value: 4 }], defaultFirstValue: true, infoMessage: 'Method of payment used for this sale' },
|
|
4001
3977
|
{ name: 'paymentReference', type: 'text', alias: 'Payment Reference', section: 'paymentInfo', infoMessage: 'Transaction reference number or payment receipt' },
|
|
4002
3978
|
{ name: 'paymentStatus', type: 'select', alias: 'Payment Status', readonly: true, section: 'paymentInfo', loadAction: { url: 'sales/list/payment-status' }, hideOnCreate: true, infoMessage: 'Current payment status of the sale' },
|
|
@@ -4035,9 +4011,11 @@ class InventoryService {
|
|
|
4035
4011
|
]
|
|
4036
4012
|
};
|
|
4037
4013
|
this.saleViewButton = { name: 'view', dialog: true, detailsConfig: this.saleDetailsConfig };
|
|
4038
|
-
this.saleCreateButton = {
|
|
4014
|
+
this.saleCreateButton = {
|
|
4015
|
+
name: 'create',
|
|
4016
|
+
display: 'Quick Sale',
|
|
4017
|
+
dialog: true,
|
|
4039
4018
|
action: { url: 'sales?action=create', method: 'post' },
|
|
4040
|
-
onSuccessButton: this.saleViewButton
|
|
4041
4019
|
};
|
|
4042
4020
|
this.salesTableConfig = {
|
|
4043
4021
|
showFilter: true,
|
|
@@ -4069,6 +4047,60 @@ class InventoryService {
|
|
|
4069
4047
|
loadAction: { url: 'sales/all/x' },
|
|
4070
4048
|
formConfig: this.saleFormConfig
|
|
4071
4049
|
};
|
|
4050
|
+
//--------------------------Inventory Stock (Grouped by Product)-------------------------
|
|
4051
|
+
// Changed: Reuse existing inventoryItemsTableConfig with product criteria filter
|
|
4052
|
+
this.inventoryStockItemsTableConfig = {
|
|
4053
|
+
...this.inventoryItemsTableConfig,
|
|
4054
|
+
tabTitle: 'Stock Items',
|
|
4055
|
+
showFilter: false,
|
|
4056
|
+
elevation: 'none',
|
|
4057
|
+
flatButtons: true,
|
|
4058
|
+
buttons: [],
|
|
4059
|
+
loadAction: { url: 'inventoryitems/stock/x' }, loadCriteria: 'product', loadIDField: 'productID'
|
|
4060
|
+
};
|
|
4061
|
+
// Changed: Reuse product form config, filter to show only Product Information section fields
|
|
4062
|
+
this.inventoryStockProductFormConfig = {
|
|
4063
|
+
...this.productFormConfig,
|
|
4064
|
+
security: { allow: [this.dataService.capInventoryStock] },
|
|
4065
|
+
fields: this.productFormConfig.fields.filter(f => f.section === 'productInfo' || f.name === 'productInfo').map(f => ({ ...f, readonly: true })),
|
|
4066
|
+
loadAction: { url: 'products/id' }
|
|
4067
|
+
};
|
|
4068
|
+
// Changed: Details config reuses simplified product form and inventory items table
|
|
4069
|
+
this.inventoryStockDetailsConfig = {
|
|
4070
|
+
formConfig: this.inventoryStockProductFormConfig,
|
|
4071
|
+
tableConfigs: [this.inventoryStockItemsTableConfig],
|
|
4072
|
+
heroField: 'productID',
|
|
4073
|
+
buttons: []
|
|
4074
|
+
};
|
|
4075
|
+
// Inventory stock summary tiles
|
|
4076
|
+
this.inventoryStockTileConfig = {
|
|
4077
|
+
clickable: true,
|
|
4078
|
+
headerPosition: 'top',
|
|
4079
|
+
tiles: [
|
|
4080
|
+
{ name: 'totalProducts', alias: 'Total Products', color: '#2196F3', info: 'Total number of products in inventory', action: { url: 'inventoryitems/stock/all' } },
|
|
4081
|
+
{ name: 'lowStockProducts', alias: 'Low Stock', color: '#FFC107', info: 'Products below minimum quantity', action: { url: 'inventoryitems/stock/lowstock' } },
|
|
4082
|
+
{ name: 'outOfStockProducts', alias: 'Out of Stock', color: '#F44336', info: 'Products with zero quantity', action: { url: 'inventoryitems/stock/outofstock' } },
|
|
4083
|
+
{ name: 'serializedProducts', alias: 'Serialized Products', color: '#9C27B0', info: 'Number of products with serial tracking', action: { url: 'inventoryitems/stock/serialized' } },
|
|
4084
|
+
],
|
|
4085
|
+
loadAction: { url: 'inventoryitems/stock/summary' }
|
|
4086
|
+
};
|
|
4087
|
+
// Changed: Table config for inventory stock grouped by product
|
|
4088
|
+
this.inventoryStockTableConfig = {
|
|
4089
|
+
showFilter: true,
|
|
4090
|
+
holdHeaderButtonSpace: true,
|
|
4091
|
+
flatButtons: true,
|
|
4092
|
+
minColumns: ['productName', 'totalQuantity'],
|
|
4093
|
+
columns: [
|
|
4094
|
+
{ name: 'productName', type: 'button', alias: 'Product', detailsConfig: this.inventoryStockDetailsConfig },
|
|
4095
|
+
{ name: 'totalQuantity', type: 'number', alias: 'Total Stock', icon: { name: 'warning', color: 'orange', condition: (x) => x.isLowInventory } }
|
|
4096
|
+
],
|
|
4097
|
+
buttons: [
|
|
4098
|
+
{ name: 'view', dialog: true, detailsConfig: this.inventoryStockDetailsConfig, },
|
|
4099
|
+
],
|
|
4100
|
+
loadAction: { url: 'inventoryitems/stock/all' },
|
|
4101
|
+
formConfig: this.productFormConfig,
|
|
4102
|
+
tileConfig: this.inventoryStockTileConfig
|
|
4103
|
+
};
|
|
4072
4104
|
this.productDetailsConfig = {
|
|
4073
4105
|
formConfig: this.productFormConfig,
|
|
4074
4106
|
heroField: 'productID',
|
|
@@ -13676,11 +13708,11 @@ class LoginComponent {
|
|
|
13676
13708
|
}
|
|
13677
13709
|
}
|
|
13678
13710
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoginComponent, deps: [{ token: HttpService }, { token: StorageService }, { token: i1$2.Router }, { token: MessageService }, { token: DataServiceLib }, { token: AuthService }, { token: LogService }, { token: i1$2.ActivatedRoute }, { token: NotificationsService }, { token: i9$1.MsalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13679
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoginComponent, isStandalone: false, selector: "spa-login", ngImport: i0, template: "\r\n <div *ngIf=\"style=='default'\" class=\"login-page background tin-bg-login\">\r\n\r\n <div class=\"container\" >\r\n\r\n <div class=\"logo\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <mat-card class=\"mat-elevation-z3 \" style=\"width:400px; \">\r\n\r\n <mat-card-header style=\"margin-bottom: 30px;margin-top: 30px;\">\r\n <mat-card-title style=\"font-size: 40px;margin-bottom: 10px; margin-top: 20px; font-weight: 300\">{{appConfig.appName}}</mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n\r\n <div class=\"tin-input mt-2\">\r\n\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <spa-text id=\"txtPassword\" display=\"Password\" format=\"password\" [(value)]=\"user.password\" (enterPress)=\"login()\"></spa-text>\r\n\r\n </div>\r\n\r\n </mat-card-content>\r\n\r\n\r\n <mat-card-actions style=\"margin-bottom: 10px;\">\r\n\r\n <div class=\"button mt-0\" *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n <button id=\"btnLogin\" mat-flat-button [disabled]=\"isProcessing\" style=\"width: 350px;\" (click)=\"login()\" color=\"primary\">Login</button>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"(appConfig.localAuth || appConfig.ADAuth) && appConfig.selfService\" >\r\n <button id=\"btnSignup\" mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"signup()\">Sign up with Email</button>\r\n </div>\r\n\r\n <div class=\"divider\" *ngIf=\"appConfig.googleAuth || appConfig.microsoftAuth\">\r\n <span>OR</span>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"appConfig.googleAuth\">\r\n <asl-google-signin-button type='standard' width=\"320px\" size='medium' logo_alignment=\"center\" style=\"text-align: center;\"></asl-google-signin-button>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"appConfig.microsoftAuth\">\r\n <button mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"loginWithMS()\">{{appConfig.microsoftAuthMessage}}</button>\r\n </div>\r\n\r\n </mat-card-actions>\r\n\r\n </mat-card>\r\n\r\n <a *ngIf=\"appConfig.selfService\" mat-button id=\"lnkRecover\" style=\"margin-top: 1em\" (click)=\"recoverAccount()\">Forgot your password ?</a>\r\n\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"style=='modern'\" class=\"modern-login\">\r\n <mat-card class=\"login-card\">\r\n <!-- Logo -->\r\n <div class=\"logo-container\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <!-- Welcome text -->\r\n <div class=\"header-section\"> <!-- Changed: Use custom div instead of mat-card-header -->\r\n <h2 class=\"login-title\">{{appConfig.loginTitle ?? appConfig.appName}}</h2> <!-- Changed: Use h2 for title -->\r\n <p class=\"login-subtitle\" *ngIf=\"appConfig.loginMessage\">{{appConfig.loginMessage}}</p> <!-- Changed: Use p for subtitle -->\r\n </div>\r\n\r\n <mat-card-content>\r\n <div class=\"login-form\">\r\n <!-- Username -->\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" [appearance]=\"'outline'\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <!-- Password -->\r\n <spa-text id=\"txtPassword\" display=\"Password\" format=\"password\" [(value)]=\"user.password\" [appearance]=\"'outline'\" (enterPress)=\"login()\"></spa-text>\r\n\r\n <!-- Login Button -->\r\n <div class=\"button-container\">\r\n <button id=\"btnLogin\" mat-flat-button color=\"primary\" [disabled]=\"isProcessing\" (click)=\"login()\">\r\n Login\r\n </button>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"divider\">\r\n <span>OR</span>\r\n </div>\r\n\r\n <!-- Social Login -->\r\n <div *ngIf=\"appConfig.googleAuth\" class=\"social-login\">\r\n <asl-google-signin-button type='standard' size='medium' width=\"320\" logo_alignment=\"center\" shape=\"pill\"></asl-google-signin-button>\r\n </div>\r\n\r\n <!-- Microsoft Login -->\r\n <div class=\"button\" *ngIf=\"appConfig.microsoftAuth\">\r\n <button mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"loginWithMS()\">{{appConfig.microsoftAuthMessage}}</button>\r\n </div>\r\n\r\n <!-- Links -->\r\n <div class=\"links-container mb-5\">\r\n <a *ngIf=\"appConfig.selfService\" mat-button id=\"lnkRecover\" color=\"primary\" (click)=\"recoverAccount()\">\r\n Forgot password?\r\n </a>\r\n\r\n <div *ngIf=\"appConfig.selfService\" class=\"signup-container\">\r\n <span>Don't have an account?</span>\r\n <a mat-button id=\"btnSignup\" color=\"primary\" (click)=\"signup()\">Sign up</a>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n\r\n <mat-card-footer>\r\n <div class=\"terms-container\">\r\n <mat-divider></mat-divider>\r\n <p class=\"terms-text\">\r\n By continuing, you acknowledge that you accept our\r\n <a mat-button color=\"primary\" class=\"terms-link\" [href]=\"appConfig.termsUrl\" target=\"_blank\">Terms and Conditions</a>\r\n and\r\n <a mat-button color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.\r\n </p>\r\n </div>\r\n </mat-card-footer>\r\n </mat-card>\r\n</div>\r\n\r\n\r\n\r\n", styles: [".login-page{position:absolute;inset:0;overflow:auto}.background{min-height:100%}.container{display:flex;flex-direction:column;align-items:center;height:100vh}.logo{margin-top:3em;margin-bottom:1em}.container mat-card-header{text-align:center;justify-content:center}.container mat-card-title{text-align:center}.container mat-card-actions{display:flex;flex-direction:column;align-items:center;justify-content:center}.buttons{display:flex;flex-direction:row;justify-content:space-evenly}.button{display:flex;flex-direction:row;justify-content:center;margin-top:10px}.modern-login{min-height:100vh;display:flex;align-items:center;justify-content:center;background-color:#000}.login-card{width:100%;max-width:400px;padding:24px}.logo-container{text-align:center;margin-bottom:24px}.header-section{text-align:center;margin-bottom:32px}.login-title{margin:0 0 8px;font-size:32px;font-weight:300;letter-spacing:.5px;color:#000000de;text-align:center}.login-subtitle{margin:0;font-size:14px;font-weight:300;color:#0000008a;letter-spacing:.25px;text-align:center}.mat-card-header{text-align:center;justify-content:center;margin-bottom:24px}.mat-card-title{margin:0;font-size:24px;font-weight:400}.mat-card-subtitle{margin:8px 0 0}.login-form{display:flex;flex-direction:column}.button-container button{width:100%;margin-top:10px;border-radius:24px;height:40px}.divider{position:relative;text-align:center;margin:10px 0}.divider span{background:transparent;padding:0 16px;color:#666;font-size:14px;position:relative}.social-login{display:flex;justify-content:center}.modern-login .button button{width:100%;border-radius:24px;height:40px;margin-top:10px}.links-container{text-align:center;margin-top:16px}.signup-container{margin-top:16px;color:#0009}.signup-container span{margin-right:8px}.terms-container{margin-top:24px;padding:16px}.terms-text{color:#0009;font-size:12px;text-align:center;margin:16px 0 0;line-height:1.5}.terms-link{padding:0 4px;min-width:auto;line-height:inherit;height:auto}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6$2.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i6$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i6$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i12$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: TextComponent, selector: "spa-text", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "format", "type", "width", "copyContent", "clearContent", "required", "min", "max", "regex", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "directive", type: i2$1.GoogleSigninButtonDirective, selector: "asl-google-signin-button", inputs: ["type", "size", "text", "shape", "theme", "logo_alignment", "width", "locale"] }] }); }
|
|
13711
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: LoginComponent, isStandalone: false, selector: "spa-login", ngImport: i0, template: "\r\n <div *ngIf=\"style=='default'\" class=\"login-page background tin-bg-login\">\r\n\r\n <div class=\"container\" >\r\n\r\n <div class=\"logo\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <mat-card class=\"mat-elevation-z3 \" style=\"width:400px; \">\r\n\r\n <mat-card-header style=\"margin-bottom: 30px;margin-top: 30px;\">\r\n <mat-card-title style=\"font-size: 40px;margin-bottom: 10px; margin-top: 20px; font-weight: 300\">{{appConfig.appName}}</mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n\r\n <div class=\"tin-input mt-2\">\r\n\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <spa-text-mask id=\"txtPassword\" display=\"Password\" [(value)]=\"user.password\" (enterPress)=\"login()\"></spa-text-mask>\r\n\r\n </div>\r\n\r\n </mat-card-content>\r\n\r\n\r\n <mat-card-actions style=\"margin-bottom: 10px;\">\r\n\r\n <div class=\"button mt-0\" *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n <button id=\"btnLogin\" mat-flat-button [disabled]=\"isProcessing\" style=\"width: 350px;\" (click)=\"login()\" color=\"primary\">Login</button>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"(appConfig.localAuth || appConfig.ADAuth) && appConfig.selfService\" >\r\n <button id=\"btnSignup\" mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"signup()\">Sign up with Email</button>\r\n </div>\r\n\r\n <div class=\"divider\" *ngIf=\"appConfig.googleAuth || appConfig.microsoftAuth\">\r\n <span>OR</span>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"appConfig.googleAuth\">\r\n <asl-google-signin-button type='standard' width=\"320px\" size='medium' logo_alignment=\"center\" style=\"text-align: center;\"></asl-google-signin-button>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"appConfig.microsoftAuth\">\r\n <button mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"loginWithMS()\">{{appConfig.microsoftAuthMessage}}</button>\r\n </div>\r\n\r\n </mat-card-actions>\r\n\r\n </mat-card>\r\n\r\n <a *ngIf=\"appConfig.selfService\" mat-button id=\"lnkRecover\" style=\"margin-top: 1em\" (click)=\"recoverAccount()\">Forgot your password ?</a>\r\n\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"style=='modern'\" class=\"modern-login\">\r\n <mat-card class=\"login-card\">\r\n <!-- Logo -->\r\n <div class=\"logo-container\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <!-- Welcome text -->\r\n <div class=\"header-section\"> <!-- Changed: Use custom div instead of mat-card-header -->\r\n <h2 class=\"login-title\">{{appConfig.loginTitle ?? appConfig.appName}}</h2> <!-- Changed: Use h2 for title -->\r\n <p class=\"login-subtitle\" *ngIf=\"appConfig.loginMessage\">{{appConfig.loginMessage}}</p> <!-- Changed: Use p for subtitle -->\r\n </div>\r\n\r\n <mat-card-content>\r\n <div class=\"login-form\">\r\n <!-- Username -->\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" [appearance]=\"'outline'\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <!-- Password -->\r\n <spa-text-mask id=\"txtPassword\" display=\"Password\" [(value)]=\"user.password\" [appearance]=\"'outline'\" (enterPress)=\"login()\"></spa-text-mask>\r\n\r\n <!-- Login Button -->\r\n <div class=\"button-container\">\r\n <button id=\"btnLogin\" mat-flat-button color=\"primary\" [disabled]=\"isProcessing\" (click)=\"login()\">\r\n Login\r\n </button>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"divider\">\r\n <span>OR</span>\r\n </div>\r\n\r\n <!-- Social Login -->\r\n <div *ngIf=\"appConfig.googleAuth\" class=\"social-login\">\r\n <asl-google-signin-button type='standard' size='medium' width=\"320\" logo_alignment=\"center\" shape=\"pill\"></asl-google-signin-button>\r\n </div>\r\n\r\n <!-- Microsoft Login -->\r\n <div class=\"button\" *ngIf=\"appConfig.microsoftAuth\">\r\n <button mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"loginWithMS()\">{{appConfig.microsoftAuthMessage}}</button>\r\n </div>\r\n\r\n <!-- Links -->\r\n <div class=\"links-container mb-5\">\r\n <a *ngIf=\"appConfig.selfService\" mat-button id=\"lnkRecover\" color=\"primary\" (click)=\"recoverAccount()\">\r\n Forgot password?\r\n </a>\r\n\r\n <div *ngIf=\"appConfig.selfService\" class=\"signup-container\">\r\n <span>Don't have an account?</span>\r\n <a mat-button id=\"btnSignup\" color=\"primary\" (click)=\"signup()\">Sign up</a>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n\r\n <mat-card-footer>\r\n <div class=\"terms-container\">\r\n <mat-divider></mat-divider>\r\n <p class=\"terms-text\">\r\n By continuing, you acknowledge that you accept our\r\n <a mat-button color=\"primary\" class=\"terms-link\" [href]=\"appConfig.termsUrl\" target=\"_blank\">Terms and Conditions</a>\r\n and\r\n <a mat-button color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.\r\n </p>\r\n </div>\r\n </mat-card-footer>\r\n </mat-card>\r\n</div>\r\n\r\n\r\n\r\n", styles: [".login-page{position:absolute;inset:0;overflow:auto}.background{min-height:100%}.container{display:flex;flex-direction:column;align-items:center;height:100vh}.logo{margin-top:3em;margin-bottom:1em}.container mat-card-header{text-align:center;justify-content:center}.container mat-card-title{text-align:center}.container mat-card-actions{display:flex;flex-direction:column;align-items:center;justify-content:center}.buttons{display:flex;flex-direction:row;justify-content:space-evenly}.button{display:flex;flex-direction:row;justify-content:center;margin-top:10px}.modern-login{min-height:100vh;display:flex;align-items:center;justify-content:center;background-color:#000}.login-card{width:100%;max-width:400px;padding:24px}.logo-container{text-align:center;margin-bottom:24px}.header-section{text-align:center;margin-bottom:32px}.login-title{margin:0 0 8px;font-size:32px;font-weight:300;letter-spacing:.5px;color:#000000de;text-align:center}.login-subtitle{margin:0;font-size:14px;font-weight:300;color:#0000008a;letter-spacing:.25px;text-align:center}.mat-card-header{text-align:center;justify-content:center;margin-bottom:24px}.mat-card-title{margin:0;font-size:24px;font-weight:400}.mat-card-subtitle{margin:8px 0 0}.login-form{display:flex;flex-direction:column}.button-container button{width:100%;margin-top:10px;border-radius:24px;height:40px}.divider{position:relative;text-align:center;margin:10px 0}.divider span{background:transparent;padding:0 16px;color:#666;font-size:14px;position:relative}.social-login{display:flex;justify-content:center}.modern-login .button button{width:100%;border-radius:24px;height:40px;margin-top:10px}.links-container{text-align:center;margin-top:16px}.signup-container{margin-top:16px;color:#0009}.signup-container span{margin-right:8px}.terms-container{margin-top:24px;padding:16px}.terms-text{color:#0009;font-size:12px;text-align:center;margin:16px 0 0;line-height:1.5}.terms-link{padding:0 4px;min-width:auto;line-height:inherit;height:auto}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6$2.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i6$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i6$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i12$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: TextComponent, selector: "spa-text", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "format", "type", "width", "copyContent", "clearContent", "required", "min", "max", "regex", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "component", type: TextMaskComponent, selector: "spa-text-mask", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "width", "required", "min", "max", "regex", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "directive", type: i2$1.GoogleSigninButtonDirective, selector: "asl-google-signin-button", inputs: ["type", "size", "text", "shape", "theme", "logo_alignment", "width", "locale"] }] }); }
|
|
13680
13712
|
}
|
|
13681
13713
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LoginComponent, decorators: [{
|
|
13682
13714
|
type: Component,
|
|
13683
|
-
args: [{ selector: "spa-login", standalone: false, template: "\r\n <div *ngIf=\"style=='default'\" class=\"login-page background tin-bg-login\">\r\n\r\n <div class=\"container\" >\r\n\r\n <div class=\"logo\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <mat-card class=\"mat-elevation-z3 \" style=\"width:400px; \">\r\n\r\n <mat-card-header style=\"margin-bottom: 30px;margin-top: 30px;\">\r\n <mat-card-title style=\"font-size: 40px;margin-bottom: 10px; margin-top: 20px; font-weight: 300\">{{appConfig.appName}}</mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n\r\n <div class=\"tin-input mt-2\">\r\n\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <spa-text id=\"txtPassword\" display=\"Password\"
|
|
13715
|
+
args: [{ selector: "spa-login", standalone: false, template: "\r\n <div *ngIf=\"style=='default'\" class=\"login-page background tin-bg-login\">\r\n\r\n <div class=\"container\" >\r\n\r\n <div class=\"logo\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <mat-card class=\"mat-elevation-z3 \" style=\"width:400px; \">\r\n\r\n <mat-card-header style=\"margin-bottom: 30px;margin-top: 30px;\">\r\n <mat-card-title style=\"font-size: 40px;margin-bottom: 10px; margin-top: 20px; font-weight: 300\">{{appConfig.appName}}</mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n\r\n <div class=\"tin-input mt-2\">\r\n\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <spa-text-mask id=\"txtPassword\" display=\"Password\" [(value)]=\"user.password\" (enterPress)=\"login()\"></spa-text-mask>\r\n\r\n </div>\r\n\r\n </mat-card-content>\r\n\r\n\r\n <mat-card-actions style=\"margin-bottom: 10px;\">\r\n\r\n <div class=\"button mt-0\" *ngIf=\"appConfig.localAuth || appConfig.ADAuth\">\r\n <button id=\"btnLogin\" mat-flat-button [disabled]=\"isProcessing\" style=\"width: 350px;\" (click)=\"login()\" color=\"primary\">Login</button>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"(appConfig.localAuth || appConfig.ADAuth) && appConfig.selfService\" >\r\n <button id=\"btnSignup\" mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"signup()\">Sign up with Email</button>\r\n </div>\r\n\r\n <div class=\"divider\" *ngIf=\"appConfig.googleAuth || appConfig.microsoftAuth\">\r\n <span>OR</span>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"appConfig.googleAuth\">\r\n <asl-google-signin-button type='standard' width=\"320px\" size='medium' logo_alignment=\"center\" style=\"text-align: center;\"></asl-google-signin-button>\r\n </div>\r\n\r\n <div class=\"button\" *ngIf=\"appConfig.microsoftAuth\">\r\n <button mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"loginWithMS()\">{{appConfig.microsoftAuthMessage}}</button>\r\n </div>\r\n\r\n </mat-card-actions>\r\n\r\n </mat-card>\r\n\r\n <a *ngIf=\"appConfig.selfService\" mat-button id=\"lnkRecover\" style=\"margin-top: 1em\" (click)=\"recoverAccount()\">Forgot your password ?</a>\r\n\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"style=='modern'\" class=\"modern-login\">\r\n <mat-card class=\"login-card\">\r\n <!-- Logo -->\r\n <div class=\"logo-container\">\r\n <img *ngIf=\"appConfig.logoSize=='normal'\" [src]=\"appConfig.logo\" style=\"width: 100px\" />\r\n <img *ngIf=\"appConfig.logoSize=='medium'\" [src]=\"appConfig.logo\" style=\"width: 150px\" />\r\n <img *ngIf=\"appConfig.logoSize=='large'\" [src]=\"appConfig.logo\" style=\"width: 250px\" />\r\n </div>\r\n\r\n <!-- Welcome text -->\r\n <div class=\"header-section\"> <!-- Changed: Use custom div instead of mat-card-header -->\r\n <h2 class=\"login-title\">{{appConfig.loginTitle ?? appConfig.appName}}</h2> <!-- Changed: Use h2 for title -->\r\n <p class=\"login-subtitle\" *ngIf=\"appConfig.loginMessage\">{{appConfig.loginMessage}}</p> <!-- Changed: Use p for subtitle -->\r\n </div>\r\n\r\n <mat-card-content>\r\n <div class=\"login-form\">\r\n <!-- Username -->\r\n <spa-text id=\"txtuserName\" display=\"Username\" [(value)]=\"user.userName\" [appearance]=\"'outline'\" style=\"margin-bottom: 20px;\"></spa-text>\r\n\r\n <!-- Password -->\r\n <spa-text-mask id=\"txtPassword\" display=\"Password\" [(value)]=\"user.password\" [appearance]=\"'outline'\" (enterPress)=\"login()\"></spa-text-mask>\r\n\r\n <!-- Login Button -->\r\n <div class=\"button-container\">\r\n <button id=\"btnLogin\" mat-flat-button color=\"primary\" [disabled]=\"isProcessing\" (click)=\"login()\">\r\n Login\r\n </button>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"divider\">\r\n <span>OR</span>\r\n </div>\r\n\r\n <!-- Social Login -->\r\n <div *ngIf=\"appConfig.googleAuth\" class=\"social-login\">\r\n <asl-google-signin-button type='standard' size='medium' width=\"320\" logo_alignment=\"center\" shape=\"pill\"></asl-google-signin-button>\r\n </div>\r\n\r\n <!-- Microsoft Login -->\r\n <div class=\"button\" *ngIf=\"appConfig.microsoftAuth\">\r\n <button mat-stroked-button color=\"primary\" style=\"width: 350px;\" (click)=\"loginWithMS()\">{{appConfig.microsoftAuthMessage}}</button>\r\n </div>\r\n\r\n <!-- Links -->\r\n <div class=\"links-container mb-5\">\r\n <a *ngIf=\"appConfig.selfService\" mat-button id=\"lnkRecover\" color=\"primary\" (click)=\"recoverAccount()\">\r\n Forgot password?\r\n </a>\r\n\r\n <div *ngIf=\"appConfig.selfService\" class=\"signup-container\">\r\n <span>Don't have an account?</span>\r\n <a mat-button id=\"btnSignup\" color=\"primary\" (click)=\"signup()\">Sign up</a>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n\r\n <mat-card-footer>\r\n <div class=\"terms-container\">\r\n <mat-divider></mat-divider>\r\n <p class=\"terms-text\">\r\n By continuing, you acknowledge that you accept our\r\n <a mat-button color=\"primary\" class=\"terms-link\" [href]=\"appConfig.termsUrl\" target=\"_blank\">Terms and Conditions</a>\r\n and\r\n <a mat-button color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.\r\n </p>\r\n </div>\r\n </mat-card-footer>\r\n </mat-card>\r\n</div>\r\n\r\n\r\n\r\n", styles: [".login-page{position:absolute;inset:0;overflow:auto}.background{min-height:100%}.container{display:flex;flex-direction:column;align-items:center;height:100vh}.logo{margin-top:3em;margin-bottom:1em}.container mat-card-header{text-align:center;justify-content:center}.container mat-card-title{text-align:center}.container mat-card-actions{display:flex;flex-direction:column;align-items:center;justify-content:center}.buttons{display:flex;flex-direction:row;justify-content:space-evenly}.button{display:flex;flex-direction:row;justify-content:center;margin-top:10px}.modern-login{min-height:100vh;display:flex;align-items:center;justify-content:center;background-color:#000}.login-card{width:100%;max-width:400px;padding:24px}.logo-container{text-align:center;margin-bottom:24px}.header-section{text-align:center;margin-bottom:32px}.login-title{margin:0 0 8px;font-size:32px;font-weight:300;letter-spacing:.5px;color:#000000de;text-align:center}.login-subtitle{margin:0;font-size:14px;font-weight:300;color:#0000008a;letter-spacing:.25px;text-align:center}.mat-card-header{text-align:center;justify-content:center;margin-bottom:24px}.mat-card-title{margin:0;font-size:24px;font-weight:400}.mat-card-subtitle{margin:8px 0 0}.login-form{display:flex;flex-direction:column}.button-container button{width:100%;margin-top:10px;border-radius:24px;height:40px}.divider{position:relative;text-align:center;margin:10px 0}.divider span{background:transparent;padding:0 16px;color:#666;font-size:14px;position:relative}.social-login{display:flex;justify-content:center}.modern-login .button button{width:100%;border-radius:24px;height:40px;margin-top:10px}.links-container{text-align:center;margin-top:16px}.signup-container{margin-top:16px;color:#0009}.signup-container span{margin-right:8px}.terms-container{margin-top:24px;padding:16px}.terms-text{color:#0009;font-size:12px;text-align:center;margin:16px 0 0;line-height:1.5}.terms-link{padding:0 4px;min-width:auto;line-height:inherit;height:auto}\n"] }]
|
|
13684
13716
|
}], ctorParameters: () => [{ type: HttpService }, { type: StorageService }, { type: i1$2.Router }, { type: MessageService }, { type: DataServiceLib }, { type: AuthService }, { type: LogService }, { type: i1$2.ActivatedRoute }, { type: NotificationsService }, { type: i9$1.MsalService }] });
|
|
13685
13717
|
|
|
13686
13718
|
class SignupComponent {
|
|
@@ -13717,11 +13749,11 @@ class SignupComponent {
|
|
|
13717
13749
|
});
|
|
13718
13750
|
}
|
|
13719
13751
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SignupComponent, deps: [{ token: HttpService }, { token: MessageService }, { token: DataServiceLib }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13720
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SignupComponent, isStandalone: false, selector: "spa-signup", ngImport: i0, template: "\r\n<h4 style=\"padding-top: 30px;\">Sign up</h4>\r\n\r\n<hr/>\r\n\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px;\">\r\n\r\n <spa-text display=\"FirstName\" [(value)]=\"account.profile.firstName\" ></spa-text>\r\n\r\n <spa-text display=\"LastName\" [(value)]=\"account.profile.lastName\" ></spa-text>\r\n\r\n <spa-text display=\"Username\" [(value)]=\"account.profile.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-text display=\"Password\" [(value)]=\"account.profile.password\"
|
|
13752
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SignupComponent, isStandalone: false, selector: "spa-signup", ngImport: i0, template: "\r\n<h4 style=\"padding-top: 30px;\">Sign up</h4>\r\n\r\n<hr/>\r\n\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px;\">\r\n\r\n <spa-text display=\"FirstName\" [(value)]=\"account.profile.firstName\" ></spa-text>\r\n\r\n <spa-text display=\"LastName\" [(value)]=\"account.profile.lastName\" ></spa-text>\r\n\r\n <spa-text display=\"Username\" [(value)]=\"account.profile.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-text-mask display=\"Password\" [(value)]=\"account.profile.password\" ></spa-text-mask>\r\n\r\n <spa-text-mask display=\"Confirm Password\" [(value)]=\"confirmPassword\" ></spa-text-mask>\r\n\r\n <div class=\"span-col-center\">\r\n <button mat-raised-button color=\"primary\" (click)=\"create()\" cdkFocusInitial>Submit</button>\r\n </div>\r\n\r\n\r\n</div>\r\n\r\n\r\n", styles: [""], dependencies: [{ kind: "component", type: i5$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: TextComponent, selector: "spa-text", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "format", "type", "width", "copyContent", "clearContent", "required", "min", "max", "regex", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "component", type: TextMaskComponent, selector: "spa-text-mask", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "width", "required", "min", "max", "regex", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }] }); }
|
|
13721
13753
|
}
|
|
13722
13754
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SignupComponent, decorators: [{
|
|
13723
13755
|
type: Component,
|
|
13724
|
-
args: [{ selector: 'spa-signup', standalone: false, template: "\r\n<h4 style=\"padding-top: 30px;\">Sign up</h4>\r\n\r\n<hr/>\r\n\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px;\">\r\n\r\n <spa-text display=\"FirstName\" [(value)]=\"account.profile.firstName\" ></spa-text>\r\n\r\n <spa-text display=\"LastName\" [(value)]=\"account.profile.lastName\" ></spa-text>\r\n\r\n <spa-text display=\"Username\" [(value)]=\"account.profile.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-text display=\"Password\" [(value)]=\"account.profile.password\"
|
|
13756
|
+
args: [{ selector: 'spa-signup', standalone: false, template: "\r\n<h4 style=\"padding-top: 30px;\">Sign up</h4>\r\n\r\n<hr/>\r\n\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px;\">\r\n\r\n <spa-text display=\"FirstName\" [(value)]=\"account.profile.firstName\" ></spa-text>\r\n\r\n <spa-text display=\"LastName\" [(value)]=\"account.profile.lastName\" ></spa-text>\r\n\r\n <spa-text display=\"Username\" [(value)]=\"account.profile.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-text-mask display=\"Password\" [(value)]=\"account.profile.password\" ></spa-text-mask>\r\n\r\n <spa-text-mask display=\"Confirm Password\" [(value)]=\"confirmPassword\" ></spa-text-mask>\r\n\r\n <div class=\"span-col-center\">\r\n <button mat-raised-button color=\"primary\" (click)=\"create()\" cdkFocusInitial>Submit</button>\r\n </div>\r\n\r\n\r\n</div>\r\n\r\n\r\n" }]
|
|
13725
13757
|
}], ctorParameters: () => [{ type: HttpService }, { type: MessageService }, { type: DataServiceLib }, { type: AuthService }] });
|
|
13726
13758
|
|
|
13727
13759
|
class RecoverAccountComponent {
|
|
@@ -14040,11 +14072,11 @@ class SettingsComponent {
|
|
|
14040
14072
|
this.messageService.toast("Feature not Available");
|
|
14041
14073
|
}
|
|
14042
14074
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SettingsComponent, deps: [{ token: DataServiceLib }, { token: MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
14043
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SettingsComponent, isStandalone: false, selector: "spa-settings", ngImport: i0, template: "<h4>Settings</h4>\r\n<hr>\r\n\r\n<div class=\"container\">\r\n\r\n <div class=\"row justify-content-between\" style=\"padding-bottom: 10px;padding-left:10px\">\r\n\r\n <div class=\"col-2\">\r\n <!-- <button mat-raised-button (click)=\"addSetting()\">New Setting</button> -->\r\n </div>\r\n <div class=\"col-2\">\r\n <button mat-raised-button (click)=\"loadSettings()\">Refresh</button>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tin-row align-items-center mt-1 mb-1\" style=\"margin-left:10px\" *ngFor=\"let setting of settings\">\r\n\r\n <mat-form-field *ngIf=\"!setting.encrypted\" style=\"width: 500px\">\r\n <mat-label>{{setting.sName}}</mat-label>\r\n <input matInput autocomplete=\"off\" [(ngModel)]=\"setting.sValue\" >\r\n </mat-form-field>\r\n\r\n <spa-text *ngIf=\"setting.encrypted\"
|
|
14075
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SettingsComponent, isStandalone: false, selector: "spa-settings", ngImport: i0, template: "<h4>Settings</h4>\r\n<hr>\r\n\r\n<div class=\"container\">\r\n\r\n <div class=\"row justify-content-between\" style=\"padding-bottom: 10px;padding-left:10px\">\r\n\r\n <div class=\"col-2\">\r\n <!-- <button mat-raised-button (click)=\"addSetting()\">New Setting</button> -->\r\n </div>\r\n <div class=\"col-2\">\r\n <button mat-raised-button (click)=\"loadSettings()\">Refresh</button>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tin-row align-items-center mt-1 mb-1\" style=\"margin-left:10px\" *ngFor=\"let setting of settings\">\r\n\r\n <mat-form-field *ngIf=\"!setting.encrypted\" style=\"width: 500px\">\r\n <mat-label>{{setting.sName}}</mat-label>\r\n <input matInput autocomplete=\"off\" [(ngModel)]=\"setting.sValue\" >\r\n </mat-form-field>\r\n\r\n <spa-text-mask *ngIf=\"setting.encrypted\" style=\"width: 500px;\" [display]=\"setting.sName\" [(value)]=\"setting.sValue\"></spa-text-mask>\r\n\r\n <button mat-mini-fab color=\"primary\" (click)=\"updateSetting(setting)\" style=\"margin-right:10px;\"><mat-icon>done_all</mat-icon></button>\r\n\r\n <mat-label style=\"font-size: small;\">Last Updated by {{setting.updatedBy}} on {{setting.updatedDate | date: 'dd MMM yy HH:mm'}}</mat-label>\r\n\r\n </div>\r\n\r\n</div>\r\n\r\n", styles: [".mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"], dependencies: [{ kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5$1.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: TextMaskComponent, selector: "spa-text-mask", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "width", "required", "min", "max", "regex", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] }); }
|
|
14044
14076
|
}
|
|
14045
14077
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SettingsComponent, decorators: [{
|
|
14046
14078
|
type: Component,
|
|
14047
|
-
args: [{ selector: 'spa-settings', standalone: false, template: "<h4>Settings</h4>\r\n<hr>\r\n\r\n<div class=\"container\">\r\n\r\n <div class=\"row justify-content-between\" style=\"padding-bottom: 10px;padding-left:10px\">\r\n\r\n <div class=\"col-2\">\r\n <!-- <button mat-raised-button (click)=\"addSetting()\">New Setting</button> -->\r\n </div>\r\n <div class=\"col-2\">\r\n <button mat-raised-button (click)=\"loadSettings()\">Refresh</button>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tin-row align-items-center mt-1 mb-1\" style=\"margin-left:10px\" *ngFor=\"let setting of settings\">\r\n\r\n <mat-form-field *ngIf=\"!setting.encrypted\" style=\"width: 500px\">\r\n <mat-label>{{setting.sName}}</mat-label>\r\n <input matInput autocomplete=\"off\" [(ngModel)]=\"setting.sValue\" >\r\n </mat-form-field>\r\n\r\n <spa-text *ngIf=\"setting.encrypted\"
|
|
14079
|
+
args: [{ selector: 'spa-settings', standalone: false, template: "<h4>Settings</h4>\r\n<hr>\r\n\r\n<div class=\"container\">\r\n\r\n <div class=\"row justify-content-between\" style=\"padding-bottom: 10px;padding-left:10px\">\r\n\r\n <div class=\"col-2\">\r\n <!-- <button mat-raised-button (click)=\"addSetting()\">New Setting</button> -->\r\n </div>\r\n <div class=\"col-2\">\r\n <button mat-raised-button (click)=\"loadSettings()\">Refresh</button>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"tin-row align-items-center mt-1 mb-1\" style=\"margin-left:10px\" *ngFor=\"let setting of settings\">\r\n\r\n <mat-form-field *ngIf=\"!setting.encrypted\" style=\"width: 500px\">\r\n <mat-label>{{setting.sName}}</mat-label>\r\n <input matInput autocomplete=\"off\" [(ngModel)]=\"setting.sValue\" >\r\n </mat-form-field>\r\n\r\n <spa-text-mask *ngIf=\"setting.encrypted\" style=\"width: 500px;\" [display]=\"setting.sName\" [(value)]=\"setting.sValue\"></spa-text-mask>\r\n\r\n <button mat-mini-fab color=\"primary\" (click)=\"updateSetting(setting)\" style=\"margin-right:10px;\"><mat-icon>done_all</mat-icon></button>\r\n\r\n <mat-label style=\"font-size: small;\">Last Updated by {{setting.updatedBy}} on {{setting.updatedDate | date: 'dd MMM yy HH:mm'}}</mat-label>\r\n\r\n </div>\r\n\r\n</div>\r\n\r\n", styles: [".mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"] }]
|
|
14048
14080
|
}], ctorParameters: () => [{ type: DataServiceLib }, { type: MessageService }] });
|
|
14049
14081
|
|
|
14050
14082
|
class LogsComponent {
|
|
@@ -14481,11 +14513,11 @@ class CreateAccountComponent {
|
|
|
14481
14513
|
this.router.navigate(["home/user/profile"]);
|
|
14482
14514
|
}
|
|
14483
14515
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CreateAccountComponent, deps: [{ token: HttpService }, { token: MessageService }, { token: DataServiceLib }, { token: AuthService }, { token: i1$2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
14484
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CreateAccountComponent, isStandalone: false, selector: "spa-create-account", inputs: { appConfig: "appConfig" }, ngImport: i0, template: "<h4>Create User</h4>\r\n\r\n<hr/>\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px; max-width: 70%;\">\r\n\r\n <spa-text id=\"txtUserName\" display=\"Username\" [(value)]=\"register.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-select id=\"cboAuth\" display=\"Authentication Type\" [options]=\"authTypes\" optionDisplay=\"name\" optionValue=\"value\" [(value)]=\"register.authType\" (valueChange)=\"check()\" ></spa-select>\r\n\r\n \r\n\r\n <spa-text id=\"txtFirstName\" display=\"FirstName\" [(value)]=\"register.firstName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n <spa-text id=\"txtLastName\" display=\"LastName\" [(value)]=\"register.lastName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n\r\n <spa-text *ngIf=\"register.authType == 'local'\" id=\"txtPassword\" display=\"Password\"
|
|
14516
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CreateAccountComponent, isStandalone: false, selector: "spa-create-account", inputs: { appConfig: "appConfig" }, ngImport: i0, template: "<h4>Create User</h4>\r\n\r\n<hr/>\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px; max-width: 70%;\">\r\n\r\n <spa-text id=\"txtUserName\" display=\"Username\" [(value)]=\"register.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-select id=\"cboAuth\" display=\"Authentication Type\" [options]=\"authTypes\" optionDisplay=\"name\" optionValue=\"value\" [(value)]=\"register.authType\" (valueChange)=\"check()\" ></spa-select>\r\n\r\n \r\n\r\n <spa-text id=\"txtFirstName\" display=\"FirstName\" [(value)]=\"register.firstName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n <spa-text id=\"txtLastName\" display=\"LastName\" [(value)]=\"register.lastName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n\r\n <spa-text-mask *ngIf=\"register.authType == 'local'\" id=\"txtPassword\" display=\"Password\" [(value)]=\"register.password\" ></spa-text-mask>\r\n\r\n <spa-text-mask *ngIf=\"register.authType == 'local'\" id=\"txtConfirmPassword\" display=\"Confirm Password\" [(value)]=\"confirmPassword\" ></spa-text-mask>\r\n\r\n <spa-text id=\"txtEmail\" display=\"Email\" [(value)]=\"register.email\"></spa-text>\r\n\r\n \r\n\r\n <spa-select id=\"cboRole\" display=\"Role\" [options]=\"roles\" optionDisplay=\"roleName\" optionValue=\"roleID\" [(value)]=\"register.roleID\"></spa-select>\r\n\r\n \r\n\r\n <spa-check display=\"Open profile after creation\" [(value)]=\"openProfile\"></spa-check>\r\n\r\n <div class=\"span-col-center\">\r\n <button id=\"btnCreate\" [disabled]=\"register.authType ==''\" mat-raised-button color=\"primary\" (click)=\"create()\" cdkFocusInitial>Create</button>\r\n </div>\r\n\r\n\r\n\r\n</div>\r\n\r\n\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: TextComponent, selector: "spa-text", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "format", "type", "width", "copyContent", "clearContent", "required", "min", "max", "regex", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "component", type: TextMaskComponent, selector: "spa-text-mask", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "width", "required", "min", "max", "regex", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "component", type: SelectComponent, selector: "spa-select", inputs: ["detailsConfig"] }, { kind: "component", type: CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value", "infoMessage"], outputs: ["valueChange", "click", "check", "uncheck", "infoClick"] }] }); }
|
|
14485
14517
|
}
|
|
14486
14518
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CreateAccountComponent, decorators: [{
|
|
14487
14519
|
type: Component,
|
|
14488
|
-
args: [{ selector: 'spa-create-account', standalone: false, template: "<h4>Create User</h4>\r\n\r\n<hr/>\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px; max-width: 70%;\">\r\n\r\n <spa-text id=\"txtUserName\" display=\"Username\" [(value)]=\"register.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-select id=\"cboAuth\" display=\"Authentication Type\" [options]=\"authTypes\" optionDisplay=\"name\" optionValue=\"value\" [(value)]=\"register.authType\" (valueChange)=\"check()\" ></spa-select>\r\n\r\n \r\n\r\n <spa-text id=\"txtFirstName\" display=\"FirstName\" [(value)]=\"register.firstName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n <spa-text id=\"txtLastName\" display=\"LastName\" [(value)]=\"register.lastName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n\r\n <spa-text *ngIf=\"register.authType == 'local'\" id=\"txtPassword\" display=\"Password\"
|
|
14520
|
+
args: [{ selector: 'spa-create-account', standalone: false, template: "<h4>Create User</h4>\r\n\r\n<hr/>\r\n\r\n<div class=\"container tin-grid\" style=\"font-size:14px; max-width: 70%;\">\r\n\r\n <spa-text id=\"txtUserName\" display=\"Username\" [(value)]=\"register.userName\"></spa-text>\r\n\r\n \r\n\r\n <spa-select id=\"cboAuth\" display=\"Authentication Type\" [options]=\"authTypes\" optionDisplay=\"name\" optionValue=\"value\" [(value)]=\"register.authType\" (valueChange)=\"check()\" ></spa-select>\r\n\r\n \r\n\r\n <spa-text id=\"txtFirstName\" display=\"FirstName\" [(value)]=\"register.firstName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n <spa-text id=\"txtLastName\" display=\"LastName\" [(value)]=\"register.lastName\" [readonly]=\"register.authType =='AD'\"></spa-text>\r\n\r\n\r\n <spa-text-mask *ngIf=\"register.authType == 'local'\" id=\"txtPassword\" display=\"Password\" [(value)]=\"register.password\" ></spa-text-mask>\r\n\r\n <spa-text-mask *ngIf=\"register.authType == 'local'\" id=\"txtConfirmPassword\" display=\"Confirm Password\" [(value)]=\"confirmPassword\" ></spa-text-mask>\r\n\r\n <spa-text id=\"txtEmail\" display=\"Email\" [(value)]=\"register.email\"></spa-text>\r\n\r\n \r\n\r\n <spa-select id=\"cboRole\" display=\"Role\" [options]=\"roles\" optionDisplay=\"roleName\" optionValue=\"roleID\" [(value)]=\"register.roleID\"></spa-select>\r\n\r\n \r\n\r\n <spa-check display=\"Open profile after creation\" [(value)]=\"openProfile\"></spa-check>\r\n\r\n <div class=\"span-col-center\">\r\n <button id=\"btnCreate\" [disabled]=\"register.authType ==''\" mat-raised-button color=\"primary\" (click)=\"create()\" cdkFocusInitial>Create</button>\r\n </div>\r\n\r\n\r\n\r\n</div>\r\n\r\n\r\n" }]
|
|
14489
14521
|
}], ctorParameters: () => [{ type: HttpService }, { type: MessageService }, { type: DataServiceLib }, { type: AuthService }, { type: i1$2.Router }], propDecorators: { appConfig: [{
|
|
14490
14522
|
type: Input
|
|
14491
14523
|
}] } });
|