@plusscommunities/pluss-feature-builder-app-c 1.0.1-beta.3

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.
Files changed (118) hide show
  1. package/dist/module/actions/featureBuilderActions.js +106 -0
  2. package/dist/module/actions/featureBuilderActions.js.map +1 -0
  3. package/dist/module/actions/featureBuilderStringsActions.js +106 -0
  4. package/dist/module/actions/featureBuilderStringsActions.js.map +1 -0
  5. package/dist/module/actions/index.js +12 -0
  6. package/dist/module/actions/index.js.map +1 -0
  7. package/dist/module/actions/types.js +7 -0
  8. package/dist/module/actions/types.js.map +1 -0
  9. package/dist/module/components/FeatureDetailScreen.js +725 -0
  10. package/dist/module/components/FeatureDetailScreen.js.map +1 -0
  11. package/dist/module/components/FeatureListItem.js +174 -0
  12. package/dist/module/components/FeatureListItem.js.map +1 -0
  13. package/dist/module/components/FeatureListScreen.js +159 -0
  14. package/dist/module/components/FeatureListScreen.js.map +1 -0
  15. package/dist/module/components/FieldRenderer.js +218 -0
  16. package/dist/module/components/FieldRenderer.js.map +1 -0
  17. package/dist/module/components/FileDownload.js +74 -0
  18. package/dist/module/components/FileDownload.js.map +1 -0
  19. package/dist/module/components/WidgetGrid.js +158 -0
  20. package/dist/module/components/WidgetGrid.js.map +1 -0
  21. package/dist/module/components/WidgetLarge.js +274 -0
  22. package/dist/module/components/WidgetLarge.js.map +1 -0
  23. package/dist/module/components/WidgetSmall.js +315 -0
  24. package/dist/module/components/WidgetSmall.js.map +1 -0
  25. package/dist/module/components/common/index.js +25 -0
  26. package/dist/module/components/common/index.js.map +1 -0
  27. package/dist/module/components/layouts/CondensedList.js +195 -0
  28. package/dist/module/components/layouts/CondensedList.js.map +1 -0
  29. package/dist/module/components/layouts/FeatureImageList.js +172 -0
  30. package/dist/module/components/layouts/FeatureImageList.js.map +1 -0
  31. package/dist/module/components/layouts/RoundImageList.js +198 -0
  32. package/dist/module/components/layouts/RoundImageList.js.map +1 -0
  33. package/dist/module/components/layouts/SquareImageList.js +185 -0
  34. package/dist/module/components/layouts/SquareImageList.js.map +1 -0
  35. package/dist/module/config/index.js +10 -0
  36. package/dist/module/config/index.js.map +1 -0
  37. package/dist/module/core.config.js +17 -0
  38. package/dist/module/core.config.js.map +1 -0
  39. package/dist/module/feature.config.js +113 -0
  40. package/dist/module/feature.config.js.map +1 -0
  41. package/dist/module/index.js +24 -0
  42. package/dist/module/index.js.map +1 -0
  43. package/dist/module/js/Colors.js +25 -0
  44. package/dist/module/js/Colors.js.map +1 -0
  45. package/dist/module/js/FieldTypes.js +123 -0
  46. package/dist/module/js/FieldTypes.js.map +1 -0
  47. package/dist/module/js/NavigationService.js +10 -0
  48. package/dist/module/js/NavigationService.js.map +1 -0
  49. package/dist/module/js/Styles.js +3 -0
  50. package/dist/module/js/Styles.js.map +1 -0
  51. package/dist/module/js/helpers.js +29 -0
  52. package/dist/module/js/helpers.js.map +1 -0
  53. package/dist/module/js/index.js +24 -0
  54. package/dist/module/js/index.js.map +1 -0
  55. package/dist/module/js/spacing.js +29 -0
  56. package/dist/module/js/spacing.js.map +1 -0
  57. package/dist/module/js/types.js +254 -0
  58. package/dist/module/js/types.js.map +1 -0
  59. package/dist/module/reducers/featureBuilderReducer.js +75 -0
  60. package/dist/module/reducers/featureBuilderReducer.js.map +1 -0
  61. package/dist/module/utils/featureSelectors.js +9 -0
  62. package/dist/module/utils/featureSelectors.js.map +1 -0
  63. package/dist/module/values.config.a.js +96 -0
  64. package/dist/module/values.config.a.js.map +1 -0
  65. package/dist/module/values.config.b.js +96 -0
  66. package/dist/module/values.config.b.js.map +1 -0
  67. package/dist/module/values.config.c.js +96 -0
  68. package/dist/module/values.config.c.js.map +1 -0
  69. package/dist/module/values.config.d.js +96 -0
  70. package/dist/module/values.config.d.js.map +1 -0
  71. package/dist/module/values.config.js +96 -0
  72. package/dist/module/values.config.js.map +1 -0
  73. package/dist/module/webapi/featureBuilderAPI.js +59 -0
  74. package/dist/module/webapi/featureBuilderAPI.js.map +1 -0
  75. package/dist/module/webapi/helper.js +4 -0
  76. package/dist/module/webapi/helper.js.map +1 -0
  77. package/dist/module/webapi/index.js +8 -0
  78. package/dist/module/webapi/index.js.map +1 -0
  79. package/package.json +62 -0
  80. package/src/actions/featureBuilderActions.js +112 -0
  81. package/src/actions/featureBuilderStringsActions.js +114 -0
  82. package/src/actions/index.js +12 -0
  83. package/src/actions/types.js +7 -0
  84. package/src/components/FeatureDetailScreen.js +817 -0
  85. package/src/components/FeatureListItem.js +198 -0
  86. package/src/components/FeatureListScreen.js +160 -0
  87. package/src/components/FieldRenderer.js +272 -0
  88. package/src/components/FileDownload.js +79 -0
  89. package/src/components/WidgetGrid.js +181 -0
  90. package/src/components/WidgetLarge.js +305 -0
  91. package/src/components/WidgetSmall.js +344 -0
  92. package/src/components/common/index.js +25 -0
  93. package/src/components/layouts/CondensedList.js +230 -0
  94. package/src/components/layouts/FeatureImageList.js +193 -0
  95. package/src/components/layouts/RoundImageList.js +219 -0
  96. package/src/components/layouts/SquareImageList.js +205 -0
  97. package/src/config/index.js +10 -0
  98. package/src/core.config.js +29 -0
  99. package/src/feature.config.js +127 -0
  100. package/src/index.js +27 -0
  101. package/src/js/Colors.js +30 -0
  102. package/src/js/FieldTypes.js +131 -0
  103. package/src/js/NavigationService.js +12 -0
  104. package/src/js/Styles.js +3 -0
  105. package/src/js/helpers.js +30 -0
  106. package/src/js/index.js +24 -0
  107. package/src/js/spacing.js +30 -0
  108. package/src/js/types.js +253 -0
  109. package/src/reducers/featureBuilderReducer.js +64 -0
  110. package/src/utils/featureSelectors.js +8 -0
  111. package/src/values.config.a.js +104 -0
  112. package/src/values.config.b.js +104 -0
  113. package/src/values.config.c.js +104 -0
  114. package/src/values.config.d.js +104 -0
  115. package/src/values.config.js +104 -0
  116. package/src/webapi/featureBuilderAPI.js +65 -0
  117. package/src/webapi/helper.js +4 -0
  118. package/src/webapi/index.js +8 -0
@@ -0,0 +1,25 @@
1
+ import { Colours } from "../core.config";
2
+ import { values } from "../values.config";
3
+ export const getMainBrandingColourFromState = typeof (Colours === null || Colours === void 0 ? void 0 : Colours.getMainBrandingColourFromState) === "function" ? Colours.getMainBrandingColourFromState : state => {
4
+ var _state$user;
5
+ return (state === null || state === void 0 || (_state$user = state.user) === null || _state$user === void 0 || (_state$user = _state$user.siteBranding) === null || _state$user === void 0 ? void 0 : _state$user.MainBrandingColour) || values.colors.defaultBrandMain;
6
+ };
7
+ export const getLightBrandingColourFromState = typeof (Colours === null || Colours === void 0 ? void 0 : Colours.getLightBrandingColourFromState) === "function" ? Colours.getLightBrandingColourFromState : state => {
8
+ var _state$user2;
9
+ return (state === null || state === void 0 || (_state$user2 = state.user) === null || _state$user2 === void 0 || (_state$user2 = _state$user2.siteBranding) === null || _state$user2 === void 0 ? void 0 : _state$user2.LightBrandingColour) || values.colors.defaultBrandLight;
10
+ };
11
+ export const LINEGREY = Colours.LINEGREY;
12
+ export const TEXT_DARKEST = Colours.TEXT_DARKEST;
13
+ export const TEXT_DARK = Colours.TEXT_DARK;
14
+ export const TEXT_MID = Colours.TEXT_MID;
15
+ export const TEXT_LIGHT = Colours.TEXT_LIGHT;
16
+ export const TEXT_LIGHTER = Colours.TEXT_LIGHTER;
17
+ export const TEXT_BLUEGREY = Colours.TEXT_BLUEGREY;
18
+ export const COLOUR_GREEN = Colours.COLOUR_GREEN;
19
+ export const COLOUR_TRANSPARENT = Colours.COLOUR_TRANSPARENT;
20
+ export const COLOUR_TEAL = Colours.COLOUR_TEAL;
21
+ export const COLOUR_PURPLE = Colours.COLOUR_PURPLE;
22
+ export const COLOUR_TANGERINE = Colours.COLOUR_TANGERINE;
23
+
24
+ // TODO: Add required references
25
+ //# sourceMappingURL=Colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Colours","values","getMainBrandingColourFromState","state","_state$user","user","siteBranding","MainBrandingColour","colors","defaultBrandMain","getLightBrandingColourFromState","_state$user2","LightBrandingColour","defaultBrandLight","LINEGREY","TEXT_DARKEST","TEXT_DARK","TEXT_MID","TEXT_LIGHT","TEXT_LIGHTER","TEXT_BLUEGREY","COLOUR_GREEN","COLOUR_TRANSPARENT","COLOUR_TEAL","COLOUR_PURPLE","COLOUR_TANGERINE"],"sources":["Colors.js"],"sourcesContent":["import { Colours } from \"../core.config\";\nimport { values } from \"../values.config\";\n\nexport const getMainBrandingColourFromState =\n\ttypeof Colours?.getMainBrandingColourFromState === \"function\"\n\t\t? Colours.getMainBrandingColourFromState\n\t\t: (state) =>\n\t\t\t\tstate?.user?.siteBranding?.MainBrandingColour ||\n\t\t\t\tvalues.colors.defaultBrandMain;\n\nexport const getLightBrandingColourFromState =\n\ttypeof Colours?.getLightBrandingColourFromState === \"function\"\n\t\t? Colours.getLightBrandingColourFromState\n\t\t: (state) =>\n\t\t\t\tstate?.user?.siteBranding?.LightBrandingColour ||\n\t\t\t\tvalues.colors.defaultBrandLight;\nexport const LINEGREY = Colours.LINEGREY;\nexport const TEXT_DARKEST = Colours.TEXT_DARKEST;\nexport const TEXT_DARK = Colours.TEXT_DARK;\nexport const TEXT_MID = Colours.TEXT_MID;\nexport const TEXT_LIGHT = Colours.TEXT_LIGHT;\nexport const TEXT_LIGHTER = Colours.TEXT_LIGHTER;\nexport const TEXT_BLUEGREY = Colours.TEXT_BLUEGREY;\nexport const COLOUR_GREEN = Colours.COLOUR_GREEN;\nexport const COLOUR_TRANSPARENT = Colours.COLOUR_TRANSPARENT;\nexport const COLOUR_TEAL = Colours.COLOUR_TEAL;\nexport const COLOUR_PURPLE = Colours.COLOUR_PURPLE;\nexport const COLOUR_TANGERINE = Colours.COLOUR_TANGERINE;\n\n// TODO: Add required references\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,gBAAgB;AACxC,SAASC,MAAM,QAAQ,kBAAkB;AAEzC,OAAO,MAAMC,8BAA8B,GAC1C,QAAOF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,8BAA8B,MAAK,UAAU,GAC1DF,OAAO,CAACE,8BAA8B,GACrCC,KAAK;EAAA,IAAAC,WAAA;EAAA,OACN,CAAAD,KAAK,aAALA,KAAK,gBAAAC,WAAA,GAALD,KAAK,CAAEE,IAAI,cAAAD,WAAA,gBAAAA,WAAA,GAAXA,WAAA,CAAaE,YAAY,cAAAF,WAAA,uBAAzBA,WAAA,CAA2BG,kBAAkB,KAC7CN,MAAM,CAACO,MAAM,CAACC,gBAAgB;AAAA;AAElC,OAAO,MAAMC,+BAA+B,GAC3C,QAAOV,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEU,+BAA+B,MAAK,UAAU,GAC3DV,OAAO,CAACU,+BAA+B,GACtCP,KAAK;EAAA,IAAAQ,YAAA;EAAA,OACN,CAAAR,KAAK,aAALA,KAAK,gBAAAQ,YAAA,GAALR,KAAK,CAAEE,IAAI,cAAAM,YAAA,gBAAAA,YAAA,GAAXA,YAAA,CAAaL,YAAY,cAAAK,YAAA,uBAAzBA,YAAA,CAA2BC,mBAAmB,KAC9CX,MAAM,CAACO,MAAM,CAACK,iBAAiB;AAAA;AACnC,OAAO,MAAMC,QAAQ,GAAGd,OAAO,CAACc,QAAQ;AACxC,OAAO,MAAMC,YAAY,GAAGf,OAAO,CAACe,YAAY;AAChD,OAAO,MAAMC,SAAS,GAAGhB,OAAO,CAACgB,SAAS;AAC1C,OAAO,MAAMC,QAAQ,GAAGjB,OAAO,CAACiB,QAAQ;AACxC,OAAO,MAAMC,UAAU,GAAGlB,OAAO,CAACkB,UAAU;AAC5C,OAAO,MAAMC,YAAY,GAAGnB,OAAO,CAACmB,YAAY;AAChD,OAAO,MAAMC,aAAa,GAAGpB,OAAO,CAACoB,aAAa;AAClD,OAAO,MAAMC,YAAY,GAAGrB,OAAO,CAACqB,YAAY;AAChD,OAAO,MAAMC,kBAAkB,GAAGtB,OAAO,CAACsB,kBAAkB;AAC5D,OAAO,MAAMC,WAAW,GAAGvB,OAAO,CAACuB,WAAW;AAC9C,OAAO,MAAMC,aAAa,GAAGxB,OAAO,CAACwB,aAAa;AAClD,OAAO,MAAMC,gBAAgB,GAAGzB,OAAO,CAACyB,gBAAgB;;AAExD","ignoreList":[]}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Field Types Constants for Feature Builder
3
+ * Defines all supported field types and their properties
4
+ */
5
+
6
+ export const FIELD_TYPES = {
7
+ TITLE: "title",
8
+ TEXT: "text",
9
+ DESCRIPTION: "description",
10
+ IMAGE: "image",
11
+ GALLERY: "gallery",
12
+ FEATURE_IMAGE: "feature-image",
13
+ EMAIL: "email",
14
+ NUMBER: "number",
15
+ DATE: "date",
16
+ CTA: "cta",
17
+ FILE: "file"
18
+ };
19
+
20
+ /**
21
+ * Field type display labels for UI
22
+ */
23
+ export const FIELD_TYPE_LABELS = {
24
+ [FIELD_TYPES.TITLE]: "Title",
25
+ [FIELD_TYPES.TEXT]: "Text",
26
+ [FIELD_TYPES.DESCRIPTION]: "Description",
27
+ [FIELD_TYPES.IMAGE]: "Image",
28
+ [FIELD_TYPES.GALLERY]: "Gallery",
29
+ [FIELD_TYPES.FEATURE_IMAGE]: "Feature Image",
30
+ [FIELD_TYPES.EMAIL]: "Email",
31
+ [FIELD_TYPES.NUMBER]: "Number",
32
+ [FIELD_TYPES.DATE]: "Date",
33
+ [FIELD_TYPES.CTA]: "CTA Button",
34
+ [FIELD_TYPES.FILE]: "File"
35
+ };
36
+
37
+ /**
38
+ * Field type validation rules
39
+ */
40
+ export const FIELD_VALIDATION = {
41
+ [FIELD_TYPES.TITLE]: {
42
+ required: true,
43
+ minLength: 1
44
+ },
45
+ [FIELD_TYPES.TEXT]: {
46
+ required: true,
47
+ minLength: 1
48
+ },
49
+ [FIELD_TYPES.DESCRIPTION]: {
50
+ required: false,
51
+ minLength: 0
52
+ },
53
+ [FIELD_TYPES.IMAGE]: {
54
+ required: false,
55
+ allowedTypes: ["image/jpeg", "image/png", "image/gif"]
56
+ },
57
+ [FIELD_TYPES.GALLERY]: {
58
+ required: false,
59
+ allowedTypes: ["image/jpeg", "image/png", "image/gif"],
60
+ allowMultiple: true
61
+ },
62
+ [FIELD_TYPES.FEATURE_IMAGE]: {
63
+ required: true,
64
+ allowedTypes: ["image/jpeg", "image/png", "image/gif"]
65
+ },
66
+ [FIELD_TYPES.EMAIL]: {
67
+ required: false,
68
+ pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/
69
+ },
70
+ [FIELD_TYPES.NUMBER]: {
71
+ required: false,
72
+ pattern: /^\d+\.?\d*$/
73
+ },
74
+ [FIELD_TYPES.DATE]: {
75
+ required: false
76
+ },
77
+ [FIELD_TYPES.CTA]: {
78
+ required: false,
79
+ fields: ["label", "url"]
80
+ },
81
+ [FIELD_TYPES.FILE]: {
82
+ required: false,
83
+ allowMultiple: true
84
+ }
85
+ };
86
+
87
+ /**
88
+ * Get display label for field type
89
+ */
90
+ export const getFieldTypeLabel = fieldType => {
91
+ return FIELD_TYPE_LABELS[fieldType] || fieldType;
92
+ };
93
+
94
+ /**
95
+ * Check if field type is a CTA (has label and url structure)
96
+ */
97
+ export const isCTAField = fieldValue => {
98
+ return fieldValue && typeof fieldValue === "object" && fieldValue.label && fieldValue.url;
99
+ };
100
+
101
+ /**
102
+ * Check if field value represents an image
103
+ */
104
+ export const isImageField = fieldValue => {
105
+ if (typeof fieldValue === "string") {
106
+ return fieldValue.startsWith("http://") || fieldValue.startsWith("https://");
107
+ }
108
+ if (typeof fieldValue === "object" && (fieldValue.uri || fieldValue.url)) {
109
+ return true;
110
+ }
111
+ return false;
112
+ };
113
+
114
+ /**
115
+ * Check if field value represents a link/URL
116
+ */
117
+ export const isLinkField = fieldValue => {
118
+ if (typeof fieldValue === "string") {
119
+ return fieldValue.startsWith("http://") || fieldValue.startsWith("https://");
120
+ }
121
+ return false;
122
+ };
123
+ //# sourceMappingURL=FieldTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FIELD_TYPES","TITLE","TEXT","DESCRIPTION","IMAGE","GALLERY","FEATURE_IMAGE","EMAIL","NUMBER","DATE","CTA","FILE","FIELD_TYPE_LABELS","FIELD_VALIDATION","required","minLength","allowedTypes","allowMultiple","pattern","fields","getFieldTypeLabel","fieldType","isCTAField","fieldValue","label","url","isImageField","startsWith","uri","isLinkField"],"sources":["FieldTypes.js"],"sourcesContent":["/**\n * Field Types Constants for Feature Builder\n * Defines all supported field types and their properties\n */\n\nexport const FIELD_TYPES = {\n\tTITLE: \"title\",\n\tTEXT: \"text\",\n\tDESCRIPTION: \"description\",\n\tIMAGE: \"image\",\n\tGALLERY: \"gallery\",\n\tFEATURE_IMAGE: \"feature-image\",\n\tEMAIL: \"email\",\n\tNUMBER: \"number\",\n\tDATE: \"date\",\n\tCTA: \"cta\",\n\tFILE: \"file\",\n};\n\n/**\n * Field type display labels for UI\n */\nexport const FIELD_TYPE_LABELS = {\n\t[FIELD_TYPES.TITLE]: \"Title\",\n\t[FIELD_TYPES.TEXT]: \"Text\",\n\t[FIELD_TYPES.DESCRIPTION]: \"Description\",\n\t[FIELD_TYPES.IMAGE]: \"Image\",\n\t[FIELD_TYPES.GALLERY]: \"Gallery\",\n\t[FIELD_TYPES.FEATURE_IMAGE]: \"Feature Image\",\n\t[FIELD_TYPES.EMAIL]: \"Email\",\n\t[FIELD_TYPES.NUMBER]: \"Number\",\n\t[FIELD_TYPES.DATE]: \"Date\",\n\t[FIELD_TYPES.CTA]: \"CTA Button\",\n\t[FIELD_TYPES.FILE]: \"File\",\n};\n\n/**\n * Field type validation rules\n */\nexport const FIELD_VALIDATION = {\n\t[FIELD_TYPES.TITLE]: {\n\t\trequired: true,\n\t\tminLength: 1,\n\t},\n\t[FIELD_TYPES.TEXT]: {\n\t\trequired: true,\n\t\tminLength: 1,\n\t},\n\t[FIELD_TYPES.DESCRIPTION]: {\n\t\trequired: false,\n\t\tminLength: 0,\n\t},\n\t[FIELD_TYPES.IMAGE]: {\n\t\trequired: false,\n\t\tallowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\"],\n\t},\n\t[FIELD_TYPES.GALLERY]: {\n\t\trequired: false,\n\t\tallowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\"],\n\t\tallowMultiple: true,\n\t},\n\t[FIELD_TYPES.FEATURE_IMAGE]: {\n\t\trequired: true,\n\t\tallowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\"],\n\t},\n\t[FIELD_TYPES.EMAIL]: {\n\t\trequired: false,\n\t\tpattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n\t},\n\t[FIELD_TYPES.NUMBER]: {\n\t\trequired: false,\n\t\tpattern: /^\\d+\\.?\\d*$/,\n\t},\n\t[FIELD_TYPES.DATE]: {\n\t\trequired: false,\n\t},\n\t[FIELD_TYPES.CTA]: {\n\t\trequired: false,\n\t\tfields: [\"label\", \"url\"],\n\t},\n\t[FIELD_TYPES.FILE]: {\n\t\trequired: false,\n\t\tallowMultiple: true,\n\t},\n};\n\n/**\n * Get display label for field type\n */\nexport const getFieldTypeLabel = (fieldType) => {\n\treturn FIELD_TYPE_LABELS[fieldType] || fieldType;\n};\n\n/**\n * Check if field type is a CTA (has label and url structure)\n */\nexport const isCTAField = (fieldValue) => {\n\treturn (\n\t\tfieldValue &&\n\t\ttypeof fieldValue === \"object\" &&\n\t\tfieldValue.label &&\n\t\tfieldValue.url\n\t);\n};\n\n/**\n * Check if field value represents an image\n */\nexport const isImageField = (fieldValue) => {\n\tif (typeof fieldValue === \"string\") {\n\t\treturn (\n\t\t\tfieldValue.startsWith(\"http://\") || fieldValue.startsWith(\"https://\")\n\t\t);\n\t}\n\tif (typeof fieldValue === \"object\" && (fieldValue.uri || fieldValue.url)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/**\n * Check if field value represents a link/URL\n */\nexport const isLinkField = (fieldValue) => {\n\tif (typeof fieldValue === \"string\") {\n\t\treturn (\n\t\t\tfieldValue.startsWith(\"http://\") || fieldValue.startsWith(\"https://\")\n\t\t);\n\t}\n\treturn false;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import { Services } from "../feature.config";
2
+ const navService = {
3
+ navigate: (routeName, params) => Services.navigation.navigate(routeName, params),
4
+ goBack: routeName => Services.navigation.goBack(routeName),
5
+ getParentRoute: () => Services.navigation.getParentRoute()
6
+ };
7
+ export default navService;
8
+
9
+ // TODO: Add required references
10
+ //# sourceMappingURL=NavigationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Services","navService","navigate","routeName","params","navigation","goBack","getParentRoute"],"sources":["NavigationService.js"],"sourcesContent":["import { Services } from \"../feature.config\";\n\nconst navService = {\n\tnavigate: (routeName, params) =>\n\t\tServices.navigation.navigate(routeName, params),\n\tgoBack: (routeName) => Services.navigation.goBack(routeName),\n\tgetParentRoute: () => Services.navigation.getParentRoute(),\n};\n\nexport default navService;\n\n// TODO: Add required references\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAE5C,MAAMC,UAAU,GAAG;EAClBC,QAAQ,EAAEA,CAACC,SAAS,EAAEC,MAAM,KAC3BJ,QAAQ,CAACK,UAAU,CAACH,QAAQ,CAACC,SAAS,EAAEC,MAAM,CAAC;EAChDE,MAAM,EAAGH,SAAS,IAAKH,QAAQ,CAACK,UAAU,CAACC,MAAM,CAACH,SAAS,CAAC;EAC5DI,cAAc,EAAEA,CAAA,KAAMP,QAAQ,CAACK,UAAU,CAACE,cAAc,CAAC;AAC1D,CAAC;AAED,eAAeN,UAAU;;AAEzB","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import { Styles } from "../core.config";
2
+ export default Styles;
3
+ //# sourceMappingURL=Styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Styles"],"sources":["Styles.js"],"sourcesContent":["import { Styles } from \"../core.config\";\n\nexport default Styles;\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,gBAAgB;AAEvC,eAAeA,MAAM","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Helper functions for Feature Builder
3
+ */
4
+
5
+ /**
6
+ * Get the summary field value from a listing based on feature definition
7
+ * Looks for a field marked with useAsSummary: true, then falls back to first description field
8
+ * @param {Object} listing - The listing object containing fields
9
+ * @param {Object} featureDefinition - The feature definition containing field definitions
10
+ * @returns {string} The summary field value or empty string
11
+ */
12
+ export const getSummaryFieldValue = (listing, featureDefinition) => {
13
+ var _featureDefinition$fi, _featureDefinition$fi2;
14
+ // First, look for field marked with useAsSummary: true
15
+ const summaryField = featureDefinition === null || featureDefinition === void 0 || (_featureDefinition$fi = featureDefinition.fields) === null || _featureDefinition$fi === void 0 ? void 0 : _featureDefinition$fi.find(field => field.useAsSummary === true);
16
+ if (summaryField) {
17
+ var _listing$fields;
18
+ return ((_listing$fields = listing.fields) === null || _listing$fields === void 0 ? void 0 : _listing$fields[summaryField.id]) || "";
19
+ }
20
+
21
+ // Fall back to first description-type field
22
+ const descriptionField = featureDefinition === null || featureDefinition === void 0 || (_featureDefinition$fi2 = featureDefinition.fields) === null || _featureDefinition$fi2 === void 0 ? void 0 : _featureDefinition$fi2.find(field => field.type === "description");
23
+ if (descriptionField) {
24
+ var _listing$fields2;
25
+ return ((_listing$fields2 = listing.fields) === null || _listing$fields2 === void 0 ? void 0 : _listing$fields2[descriptionField.id]) || "";
26
+ }
27
+ return "";
28
+ };
29
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getSummaryFieldValue","listing","featureDefinition","_featureDefinition$fi","_featureDefinition$fi2","summaryField","fields","find","field","useAsSummary","_listing$fields","id","descriptionField","type","_listing$fields2"],"sources":["helpers.js"],"sourcesContent":["/**\n * Helper functions for Feature Builder\n */\n\n/**\n * Get the summary field value from a listing based on feature definition\n * Looks for a field marked with useAsSummary: true, then falls back to first description field\n * @param {Object} listing - The listing object containing fields\n * @param {Object} featureDefinition - The feature definition containing field definitions\n * @returns {string} The summary field value or empty string\n */\nexport const getSummaryFieldValue = (listing, featureDefinition) => {\n\t// First, look for field marked with useAsSummary: true\n\tconst summaryField = featureDefinition?.fields?.find(\n\t\t(field) => field.useAsSummary === true,\n\t);\n\tif (summaryField) {\n\t\treturn listing.fields?.[summaryField.id] || \"\";\n\t}\n\n\t// Fall back to first description-type field\n\tconst descriptionField = featureDefinition?.fields?.find(\n\t\t(field) => field.type === \"description\",\n\t);\n\tif (descriptionField) {\n\t\treturn listing.fields?.[descriptionField.id] || \"\";\n\t}\n\n\treturn \"\";\n};\n"],"mappings":"AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAAGA,CAACC,OAAO,EAAEC,iBAAiB,KAAK;EAAA,IAAAC,qBAAA,EAAAC,sBAAA;EACnE;EACA,MAAMC,YAAY,GAAGH,iBAAiB,aAAjBA,iBAAiB,gBAAAC,qBAAA,GAAjBD,iBAAiB,CAAEI,MAAM,cAAAH,qBAAA,uBAAzBA,qBAAA,CAA2BI,IAAI,CAClDC,KAAK,IAAKA,KAAK,CAACC,YAAY,KAAK,IACnC,CAAC;EACD,IAAIJ,YAAY,EAAE;IAAA,IAAAK,eAAA;IACjB,OAAO,EAAAA,eAAA,GAAAT,OAAO,CAACK,MAAM,cAAAI,eAAA,uBAAdA,eAAA,CAAiBL,YAAY,CAACM,EAAE,CAAC,KAAI,EAAE;EAC/C;;EAEA;EACA,MAAMC,gBAAgB,GAAGV,iBAAiB,aAAjBA,iBAAiB,gBAAAE,sBAAA,GAAjBF,iBAAiB,CAAEI,MAAM,cAAAF,sBAAA,uBAAzBA,sBAAA,CAA2BG,IAAI,CACtDC,KAAK,IAAKA,KAAK,CAACK,IAAI,KAAK,aAC3B,CAAC;EACD,IAAID,gBAAgB,EAAE;IAAA,IAAAE,gBAAA;IACrB,OAAO,EAAAA,gBAAA,GAAAb,OAAO,CAACK,MAAM,cAAAQ,gBAAA,uBAAdA,gBAAA,CAAiBF,gBAAgB,CAACD,EAAE,CAAC,KAAI,EAAE;EACnD;EAEA,OAAO,EAAE;AACV,CAAC","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import { Session, Helper } from "../core.config";
2
+
3
+ // Session
4
+ export const authedFunction = async request => {
5
+ const result = await Session.authedFunction(request);
6
+ return result;
7
+ };
8
+ export const getSessionTokenAWS = Session.getSessionTokenAWS;
9
+ export const getSessionUidAWS = Session.getSessionUidAWS;
10
+
11
+ // Helper
12
+ export const getFirstName = Helper.getFirstName;
13
+ export const getImageSource = Helper.getImageSource;
14
+ export const StatusBarHeight = Helper.StatusBarHeight;
15
+ export const getPluralS = Helper.getPluralS;
16
+ export const getShadowStyle = Helper.getShadowStyle;
17
+ export const getSite = Helper.getSite;
18
+ export const getValueOrDefault = Helper.getValueOrDefault;
19
+ export const usersToSearchResult = Helper.usersToSearchResult;
20
+ export const searchUsers = Helper.searchUsers;
21
+ export * from "./Colors";
22
+
23
+ // TODO: Add required references
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Session","Helper","authedFunction","request","result","getSessionTokenAWS","getSessionUidAWS","getFirstName","getImageSource","StatusBarHeight","getPluralS","getShadowStyle","getSite","getValueOrDefault","usersToSearchResult","searchUsers"],"sources":["index.js"],"sourcesContent":["import { Session, Helper } from \"../core.config\";\n\n// Session\nexport const authedFunction = async (request) => {\n\tconst result = await Session.authedFunction(request);\n\treturn result;\n};\nexport const getSessionTokenAWS = Session.getSessionTokenAWS;\nexport const getSessionUidAWS = Session.getSessionUidAWS;\n\n// Helper\nexport const getFirstName = Helper.getFirstName;\nexport const getImageSource = Helper.getImageSource;\nexport const StatusBarHeight = Helper.StatusBarHeight;\nexport const getPluralS = Helper.getPluralS;\nexport const getShadowStyle = Helper.getShadowStyle;\nexport const getSite = Helper.getSite;\nexport const getValueOrDefault = Helper.getValueOrDefault;\nexport const usersToSearchResult = Helper.usersToSearchResult;\nexport const searchUsers = Helper.searchUsers;\n\nexport * from \"./Colors\";\n\n// TODO: Add required references\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,MAAM,QAAQ,gBAAgB;;AAEhD;AACA,OAAO,MAAMC,cAAc,GAAG,MAAOC,OAAO,IAAK;EAChD,MAAMC,MAAM,GAAG,MAAMJ,OAAO,CAACE,cAAc,CAACC,OAAO,CAAC;EACpD,OAAOC,MAAM;AACd,CAAC;AACD,OAAO,MAAMC,kBAAkB,GAAGL,OAAO,CAACK,kBAAkB;AAC5D,OAAO,MAAMC,gBAAgB,GAAGN,OAAO,CAACM,gBAAgB;;AAExD;AACA,OAAO,MAAMC,YAAY,GAAGN,MAAM,CAACM,YAAY;AAC/C,OAAO,MAAMC,cAAc,GAAGP,MAAM,CAACO,cAAc;AACnD,OAAO,MAAMC,eAAe,GAAGR,MAAM,CAACQ,eAAe;AACrD,OAAO,MAAMC,UAAU,GAAGT,MAAM,CAACS,UAAU;AAC3C,OAAO,MAAMC,cAAc,GAAGV,MAAM,CAACU,cAAc;AACnD,OAAO,MAAMC,OAAO,GAAGX,MAAM,CAACW,OAAO;AACrC,OAAO,MAAMC,iBAAiB,GAAGZ,MAAM,CAACY,iBAAiB;AACzD,OAAO,MAAMC,mBAAmB,GAAGb,MAAM,CAACa,mBAAmB;AAC7D,OAAO,MAAMC,WAAW,GAAGd,MAAM,CAACc,WAAW;AAE7C,cAAc,UAAU;;AAExB","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ export const SPACING = {
2
+ // Base spacing unit (4px)
3
+ XS: 4,
4
+ // Small spacing (8px)
5
+ SM: 8,
6
+ // Medium spacing (16px)
7
+ MD: 16,
8
+ // Large spacing (24px)
9
+ LG: 24,
10
+ // Extra large spacing (32px)
11
+ XL: 32,
12
+ // Double large spacing (48px)
13
+ XXL: 48
14
+ };
15
+ export const commonSpacing = {
16
+ marginTiny: SPACING.XS,
17
+ marginSmall: SPACING.SM,
18
+ marginMedium: SPACING.MD,
19
+ marginLarge: SPACING.LG,
20
+ marginXLarge: SPACING.XL,
21
+ marginXXLarge: SPACING.XXL,
22
+ paddingTiny: SPACING.XS,
23
+ paddingSmall: SPACING.SM,
24
+ paddingMedium: SPACING.MD,
25
+ paddingLarge: SPACING.LG,
26
+ paddingXLarge: SPACING.XL,
27
+ paddingXXLarge: SPACING.XXL
28
+ };
29
+ //# sourceMappingURL=spacing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SPACING","XS","SM","MD","LG","XL","XXL","commonSpacing","marginTiny","marginSmall","marginMedium","marginLarge","marginXLarge","marginXXLarge","paddingTiny","paddingSmall","paddingMedium","paddingLarge","paddingXLarge","paddingXXLarge"],"sources":["spacing.js"],"sourcesContent":["export const SPACING = {\n\t// Base spacing unit (4px)\n\tXS: 4,\n\t// Small spacing (8px)\n\tSM: 8,\n\t// Medium spacing (16px)\n\tMD: 16,\n\t// Large spacing (24px)\n\tLG: 24,\n\t// Extra large spacing (32px)\n\tXL: 32,\n\t// Double large spacing (48px)\n\tXXL: 48,\n};\n\nexport const commonSpacing = {\n\tmarginTiny: SPACING.XS,\n\tmarginSmall: SPACING.SM,\n\tmarginMedium: SPACING.MD,\n\tmarginLarge: SPACING.LG,\n\tmarginXLarge: SPACING.XL,\n\tmarginXXLarge: SPACING.XXL,\n\n\tpaddingTiny: SPACING.XS,\n\tpaddingSmall: SPACING.SM,\n\tpaddingMedium: SPACING.MD,\n\tpaddingLarge: SPACING.LG,\n\tpaddingXLarge: SPACING.XL,\n\tpaddingXXLarge: SPACING.XXL,\n};\n"],"mappings":"AAAA,OAAO,MAAMA,OAAO,GAAG;EACtB;EACAC,EAAE,EAAE,CAAC;EACL;EACAC,EAAE,EAAE,CAAC;EACL;EACAC,EAAE,EAAE,EAAE;EACN;EACAC,EAAE,EAAE,EAAE;EACN;EACAC,EAAE,EAAE,EAAE;EACN;EACAC,GAAG,EAAE;AACN,CAAC;AAED,OAAO,MAAMC,aAAa,GAAG;EAC5BC,UAAU,EAAER,OAAO,CAACC,EAAE;EACtBQ,WAAW,EAAET,OAAO,CAACE,EAAE;EACvBQ,YAAY,EAAEV,OAAO,CAACG,EAAE;EACxBQ,WAAW,EAAEX,OAAO,CAACI,EAAE;EACvBQ,YAAY,EAAEZ,OAAO,CAACK,EAAE;EACxBQ,aAAa,EAAEb,OAAO,CAACM,GAAG;EAE1BQ,WAAW,EAAEd,OAAO,CAACC,EAAE;EACvBc,YAAY,EAAEf,OAAO,CAACE,EAAE;EACxBc,aAAa,EAAEhB,OAAO,CAACG,EAAE;EACzBc,YAAY,EAAEjB,OAAO,CAACI,EAAE;EACxBc,aAAa,EAAElB,OAAO,CAACK,EAAE;EACzBc,cAAc,EAAEnB,OAAO,CAACM;AACzB,CAAC","ignoreList":[]}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Core type definitions for Feature Builder Mobile Extension
3
+ * This file contains JSDoc type definitions for all major entities used throughout the feature builder
4
+ */
5
+
6
+ /**
7
+ * @typedef {Object} FieldDefinition
8
+ * @property {string} id - Unique identifier for the field (e.g., 'mandatory-title', 'mandatory-feature-image')
9
+ * @property {string} type - Field data type ('string', 'number', 'boolean', 'image', 'pdf', 'link')
10
+ * @property {string} label - Human-readable label for the field
11
+ * @property {boolean} isMandatory - Whether this field is required for all feature definitions
12
+ * @property {Object} [validation] - Validation rules for the field
13
+ * @property {string} [validation.required] - Required validation message
14
+ * @property {string} [validation.min] - Minimum length/value validation
15
+ * @property {string} [validation.max] - Maximum length/value validation
16
+ * @property {string} [validation.pattern] - Regex pattern for validation
17
+ * @property {Object} [options] - Additional options specific to field type
18
+ * @property {string} [options.placeholder] - Placeholder text for input fields
19
+ * @property {string} [options.helpText] - Help text displayed below field
20
+ * @property {string[]} [options.allowedTypes] - Allowed file types for file fields
21
+ * @property {number} [options.maxSize] - Maximum file size in bytes
22
+ * @property {number} order - Display order of the field in forms
23
+ * @example
24
+ * const titleField = {
25
+ * id: 'mandatory-title',
26
+ * type: 'string',
27
+ * label: 'Title',
28
+ * isMandatory: true,
29
+ * validation: { required: 'Title is required' },
30
+ * options: { placeholder: 'Enter feature title' },
31
+ * order: 1
32
+ * };
33
+ */
34
+
35
+ /**
36
+ * @typedef {Object} FeatureDefinition
37
+ * @property {string} id - Unique identifier for the feature definition
38
+ * @property {string} site - Site identifier this feature belongs to
39
+ * @property {string} title - Human-readable title for the feature
40
+ * @property {string} displayName - Display name shown in UI
41
+ * @property {string} icon - Icon identifier for the feature
42
+ * @property {FieldDefinition[]} fields - Array of field definitions that make up this feature
43
+ * @property {LayoutConfig} layout - Layout configuration for displaying listings
44
+ * @property {string} createdAt - ISO timestamp when feature was created
45
+ * @property {string} editedAt - ISO timestamp when feature was last edited
46
+ * @property {string|null} deletedAt - ISO timestamp when feature was deleted (null if active)
47
+ * @example
48
+ * const featureDefinition = {
49
+ * id: 'restaurant-menu',
50
+ * site: 'pluss60-demo',
51
+ * title: 'Restaurant Menu',
52
+ * displayName: 'Menu Items',
53
+ * icon: 'restaurant',
54
+ * fields: [titleField, imageField, descriptionField],
55
+ * layout: { type: 'round', iconGrid: false },
56
+ * createdAt: '2023-12-01T10:00:00Z',
57
+ * editedAt: '2023-12-01T10:00:00Z',
58
+ * deletedAt: null
59
+ * };
60
+ */
61
+
62
+ /**
63
+ * @typedef {Object} LayoutConfig
64
+ * @property {string} type - Layout type ('round', 'square', 'condensed', 'feature')
65
+ * @property {boolean} [iconGrid] - Whether to use icon grid layout (for round/square types)
66
+ * @property {Object} [options] - Additional layout-specific options
67
+ * @property {number} [options.columns] - Number of columns for grid layouts
68
+ * @property {number} [options.itemSpacing] - Spacing between items
69
+ * @property {Object} [options.textStyling] - Text styling options
70
+ * @example
71
+ * const layoutConfig = {
72
+ * type: 'round',
73
+ * iconGrid: true,
74
+ * options: {
75
+ * columns: 2,
76
+ * itemSpacing: 16,
77
+ * textStyling: { showTitle: true, showDescription: false }
78
+ * }
79
+ * };
80
+ */
81
+
82
+ /**
83
+ * @typedef {Object} Listing
84
+ * @property {string} id - Unique identifier for the listing (UUID)
85
+ * @property {string} featureDefinitionId - ID of the feature definition this listing belongs to
86
+ * @property {Object} fields - Key-value pairs of field data
87
+ * @property {string} [fields.mandatory-title] - Title field value
88
+ * @property {string} [fields.mandatory-feature-image] - Feature image URL
89
+ * @property {*} [fields.*] - Additional field values based on feature definition
90
+ * @property {string} createdAt - ISO timestamp when listing was created
91
+ * @property {string} editedAt - ISO timestamp when listing was last edited
92
+ * @property {string|null} deletedAt - ISO timestamp when listing was deleted (null if active)
93
+ * @property {Object} [metadata] - Additional metadata about the listing
94
+ * @property {string} [metadata.createdBy] - User ID who created the listing
95
+ * @property {string} [metadata.updatedBy] - User ID who last updated the listing
96
+ * @example
97
+ * const listing = {
98
+ * id: '123e4567-e89b-12d3-a456-426614174000',
99
+ * featureDefinitionId: 'restaurant-menu',
100
+ * fields: {
101
+ * 'mandatory-title': 'Margherita Pizza',
102
+ * 'mandatory-feature-image': 'https://example.com/pizza.jpg',
103
+ * 'description': 'Classic margherita with fresh basil',
104
+ * 'price': 12.99
105
+ * },
106
+ * createdAt: '2023-12-01T10:00:00Z',
107
+ * editedAt: '2023-12-01T10:00:00Z',
108
+ * deletedAt: null
109
+ * };
110
+ */
111
+
112
+ /**
113
+ * @typedef {Object} ListingItem
114
+ * @property {string} id - Listing ID
115
+ * @property {string} title - Listing title (extracted from mandatory-title field)
116
+ * @property {string} [image] - Listing image URL (extracted from mandatory-feature-image field)
117
+ * @property {Object} fields - All field values for the listing
118
+ * @property {string} featureDefinitionId - ID of parent feature definition
119
+ * @property {FeatureDefinition} [featureDefinition] - Parent feature definition (if loaded)
120
+ * @property {boolean} isActive - Whether listing is active (not deleted)
121
+ * @property {string} createdAt - Creation timestamp
122
+ * @property {string} editedAt - Last edit timestamp
123
+ * @example
124
+ * const listItem = {
125
+ * id: '123e4567-e89b-12d3-a456-426614174000',
126
+ * title: 'Margherita Pizza',
127
+ * image: 'https://example.com/pizza.jpg',
128
+ * fields: { 'mandatory-title': 'Margherita Pizza', ... },
129
+ * featureDefinitionId: 'restaurant-menu',
130
+ * featureDefinition: restaurantMenuDefinition,
131
+ * isActive: true,
132
+ * createdAt: '2023-12-01T10:00:00Z',
133
+ * editedAt: '2023-12-01T10:00:00Z'
134
+ * };
135
+ */
136
+
137
+ /**
138
+ * @typedef {Object} FeatureBuilderState
139
+ * @property {FeatureDefinition|null} feature - Currently loaded feature definition
140
+ * @property {Listing[]} listings - Listings for the current feature
141
+ * @property {boolean} loading - Global loading state
142
+ * @property {string|null} error - Global error message
143
+ * @example
144
+ * const featureBuilderState = {
145
+ * feature: restaurantMenuDefinition,
146
+ * listings: [pizzaListing, pastaListing],
147
+ * loading: false,
148
+ * error: null
149
+ * };
150
+ */
151
+
152
+ /**
153
+ * @typedef {Object} NavigationParams
154
+ * @property {Object} [listing] - Listing data for detail view
155
+ * @property {FeatureDefinition} [featureDefinition] - Feature definition object
156
+ * @property {string} [featureTitle] - Feature title for header display
157
+ * @property {string} [mode] - Navigation mode ('view', 'edit', 'create')
158
+ * @property {Object} [metadata] - Additional navigation metadata
159
+ * @example
160
+ * const navParams = {
161
+ * listing: pizzaListing,
162
+ * featureDefinition: restaurantMenuDefinition,
163
+ * featureTitle: 'Restaurant Menu',
164
+ * mode: 'view',
165
+ * metadata: { source: 'widget' }
166
+ * };
167
+ */
168
+
169
+ /**
170
+ * @typedef {Object} WidgetProps
171
+ * @property {Listing[]} items - Listings to display in widget
172
+ * @property {FeatureDefinition} featureDefinition - Feature definition for styling
173
+ * @property {string} colourBrandingMain - Main branding color
174
+ * @property {Function} onItemPress - Callback when item is pressed
175
+ * @property {Function} [onRefresh] - Callback for pull-to-refresh
176
+ * @property {boolean} refreshing - Whether widget is currently refreshing
177
+ * @property {Object} [style] - Additional styles for widget
178
+ * @property {number} [maxItems] - Maximum number of items to display
179
+ * @example
180
+ * const widgetProps = {
181
+ * items: [pizzaListing, pastaListing],
182
+ * featureDefinition: restaurantMenuDefinition,
183
+ * colourBrandingMain: '#FF6363',
184
+ * onItemPress: (item) => navigation.navigate('Detail', { listing: item }),
185
+ * refreshing: false,
186
+ * onRefresh: handleRefresh,
187
+ * maxItems: 2
188
+ * };
189
+ */
190
+
191
+ /**
192
+ * @typedef {Object} ApiResponse
193
+ * @property {boolean} success - Whether the API call was successful
194
+ * @property {*} data - Response data payload
195
+ * @property {string} [message] - Optional message from the server
196
+ * @property {string} [error] - Error message if the call failed
197
+ * @property {number} [status] - HTTP status code
198
+ * @property {Object} [metadata] - Additional response metadata
199
+ * @example
200
+ * const apiResponse = {
201
+ * success: true,
202
+ * data: { listings: [pizzaListing, pastaListing] },
203
+ * message: 'Listings fetched successfully',
204
+ * status: 200,
205
+ * metadata: { count: 2, hasMore: false }
206
+ * };
207
+ */
208
+
209
+ /**
210
+ * @typedef {Object} FieldComponentProps
211
+ * @property {FieldDefinition} fieldDefinition - Field definition configuration
212
+ * @property {*} value - Current field value
213
+ * @property {Function} onChange - Callback when field value changes
214
+ * @property {string} [error] - Validation error message
215
+ * @property {boolean} [disabled] - Whether field is disabled
216
+ * @property {Object} [style] - Additional styles for field component
217
+ * @property {Object} [theme] - Theme configuration
218
+ * @example
219
+ * const fieldProps = {
220
+ * fieldDefinition: titleField,
221
+ * value: 'Margherita Pizza',
222
+ * onChange: (newValue) => setFieldValue('title', newValue),
223
+ * error: null,
224
+ * disabled: false,
225
+ * style: { marginBottom: 16 },
226
+ * theme: { primaryColor: '#FF6363' }
227
+ * };
228
+ */
229
+
230
+ /**
231
+ * @typedef {Object} LayoutComponentProps
232
+ * @property {Listing[]} listings - Array of listings to display
233
+ * @property {FeatureDefinition} featureDefinition - Feature definition for layout configuration
234
+ * @property {string} colourBrandingMain - Main branding color
235
+ * @property {Function} onItemPress - Callback when listing item is pressed
236
+ * @property {Function} [onRefresh] - Callback for pull-to-refresh
237
+ * @property {boolean} [refreshing] - Whether layout is currently refreshing
238
+ * @property {Object} [style] - Additional styles for layout component
239
+ * @property {Object} [layoutOptions] - Layout-specific options
240
+ * @example
241
+ * const layoutProps = {
242
+ * listings: [pizzaListing, pastaListing],
243
+ * featureDefinition: restaurantMenuDefinition,
244
+ * colourBrandingMain: '#FF6363',
245
+ * onItemPress: handleItemPress,
246
+ * refreshing: false,
247
+ * onRefresh: handleRefresh,
248
+ * layoutOptions: { showImages: true, columns: 2 }
249
+ * };
250
+ */
251
+
252
+ // Export empty object to make this a module
253
+ module.exports = {};
254
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["module","exports"],"sources":["types.js"],"sourcesContent":["/**\n * Core type definitions for Feature Builder Mobile Extension\n * This file contains JSDoc type definitions for all major entities used throughout the feature builder\n */\n\n/**\n * @typedef {Object} FieldDefinition\n * @property {string} id - Unique identifier for the field (e.g., 'mandatory-title', 'mandatory-feature-image')\n * @property {string} type - Field data type ('string', 'number', 'boolean', 'image', 'pdf', 'link')\n * @property {string} label - Human-readable label for the field\n * @property {boolean} isMandatory - Whether this field is required for all feature definitions\n * @property {Object} [validation] - Validation rules for the field\n * @property {string} [validation.required] - Required validation message\n * @property {string} [validation.min] - Minimum length/value validation\n * @property {string} [validation.max] - Maximum length/value validation\n * @property {string} [validation.pattern] - Regex pattern for validation\n * @property {Object} [options] - Additional options specific to field type\n * @property {string} [options.placeholder] - Placeholder text for input fields\n * @property {string} [options.helpText] - Help text displayed below field\n * @property {string[]} [options.allowedTypes] - Allowed file types for file fields\n * @property {number} [options.maxSize] - Maximum file size in bytes\n * @property {number} order - Display order of the field in forms\n * @example\n * const titleField = {\n * id: 'mandatory-title',\n * type: 'string',\n * label: 'Title',\n * isMandatory: true,\n * validation: { required: 'Title is required' },\n * options: { placeholder: 'Enter feature title' },\n * order: 1\n * };\n */\n\n/**\n * @typedef {Object} FeatureDefinition\n * @property {string} id - Unique identifier for the feature definition\n * @property {string} site - Site identifier this feature belongs to\n * @property {string} title - Human-readable title for the feature\n * @property {string} displayName - Display name shown in UI\n * @property {string} icon - Icon identifier for the feature\n * @property {FieldDefinition[]} fields - Array of field definitions that make up this feature\n * @property {LayoutConfig} layout - Layout configuration for displaying listings\n * @property {string} createdAt - ISO timestamp when feature was created\n * @property {string} editedAt - ISO timestamp when feature was last edited\n * @property {string|null} deletedAt - ISO timestamp when feature was deleted (null if active)\n * @example\n * const featureDefinition = {\n * id: 'restaurant-menu',\n * site: 'pluss60-demo',\n * title: 'Restaurant Menu',\n * displayName: 'Menu Items',\n * icon: 'restaurant',\n * fields: [titleField, imageField, descriptionField],\n * layout: { type: 'round', iconGrid: false },\n * createdAt: '2023-12-01T10:00:00Z',\n * editedAt: '2023-12-01T10:00:00Z',\n * deletedAt: null\n * };\n */\n\n/**\n * @typedef {Object} LayoutConfig\n * @property {string} type - Layout type ('round', 'square', 'condensed', 'feature')\n * @property {boolean} [iconGrid] - Whether to use icon grid layout (for round/square types)\n * @property {Object} [options] - Additional layout-specific options\n * @property {number} [options.columns] - Number of columns for grid layouts\n * @property {number} [options.itemSpacing] - Spacing between items\n * @property {Object} [options.textStyling] - Text styling options\n * @example\n * const layoutConfig = {\n * type: 'round',\n * iconGrid: true,\n * options: {\n * columns: 2,\n * itemSpacing: 16,\n * textStyling: { showTitle: true, showDescription: false }\n * }\n * };\n */\n\n/**\n * @typedef {Object} Listing\n * @property {string} id - Unique identifier for the listing (UUID)\n * @property {string} featureDefinitionId - ID of the feature definition this listing belongs to\n * @property {Object} fields - Key-value pairs of field data\n * @property {string} [fields.mandatory-title] - Title field value\n * @property {string} [fields.mandatory-feature-image] - Feature image URL\n * @property {*} [fields.*] - Additional field values based on feature definition\n * @property {string} createdAt - ISO timestamp when listing was created\n * @property {string} editedAt - ISO timestamp when listing was last edited\n * @property {string|null} deletedAt - ISO timestamp when listing was deleted (null if active)\n * @property {Object} [metadata] - Additional metadata about the listing\n * @property {string} [metadata.createdBy] - User ID who created the listing\n * @property {string} [metadata.updatedBy] - User ID who last updated the listing\n * @example\n * const listing = {\n * id: '123e4567-e89b-12d3-a456-426614174000',\n * featureDefinitionId: 'restaurant-menu',\n * fields: {\n * 'mandatory-title': 'Margherita Pizza',\n * 'mandatory-feature-image': 'https://example.com/pizza.jpg',\n * 'description': 'Classic margherita with fresh basil',\n * 'price': 12.99\n * },\n * createdAt: '2023-12-01T10:00:00Z',\n * editedAt: '2023-12-01T10:00:00Z',\n * deletedAt: null\n * };\n */\n\n/**\n * @typedef {Object} ListingItem\n * @property {string} id - Listing ID\n * @property {string} title - Listing title (extracted from mandatory-title field)\n * @property {string} [image] - Listing image URL (extracted from mandatory-feature-image field)\n * @property {Object} fields - All field values for the listing\n * @property {string} featureDefinitionId - ID of parent feature definition\n * @property {FeatureDefinition} [featureDefinition] - Parent feature definition (if loaded)\n * @property {boolean} isActive - Whether listing is active (not deleted)\n * @property {string} createdAt - Creation timestamp\n * @property {string} editedAt - Last edit timestamp\n * @example\n * const listItem = {\n * id: '123e4567-e89b-12d3-a456-426614174000',\n * title: 'Margherita Pizza',\n * image: 'https://example.com/pizza.jpg',\n * fields: { 'mandatory-title': 'Margherita Pizza', ... },\n * featureDefinitionId: 'restaurant-menu',\n * featureDefinition: restaurantMenuDefinition,\n * isActive: true,\n * createdAt: '2023-12-01T10:00:00Z',\n * editedAt: '2023-12-01T10:00:00Z'\n * };\n */\n\n/**\n * @typedef {Object} FeatureBuilderState\n * @property {FeatureDefinition|null} feature - Currently loaded feature definition\n * @property {Listing[]} listings - Listings for the current feature\n * @property {boolean} loading - Global loading state\n * @property {string|null} error - Global error message\n * @example\n * const featureBuilderState = {\n * feature: restaurantMenuDefinition,\n * listings: [pizzaListing, pastaListing],\n * loading: false,\n * error: null\n * };\n */\n\n/**\n * @typedef {Object} NavigationParams\n * @property {Object} [listing] - Listing data for detail view\n * @property {FeatureDefinition} [featureDefinition] - Feature definition object\n * @property {string} [featureTitle] - Feature title for header display\n * @property {string} [mode] - Navigation mode ('view', 'edit', 'create')\n * @property {Object} [metadata] - Additional navigation metadata\n * @example\n * const navParams = {\n * listing: pizzaListing,\n * featureDefinition: restaurantMenuDefinition,\n * featureTitle: 'Restaurant Menu',\n * mode: 'view',\n * metadata: { source: 'widget' }\n * };\n */\n\n/**\n * @typedef {Object} WidgetProps\n * @property {Listing[]} items - Listings to display in widget\n * @property {FeatureDefinition} featureDefinition - Feature definition for styling\n * @property {string} colourBrandingMain - Main branding color\n * @property {Function} onItemPress - Callback when item is pressed\n * @property {Function} [onRefresh] - Callback for pull-to-refresh\n * @property {boolean} refreshing - Whether widget is currently refreshing\n * @property {Object} [style] - Additional styles for widget\n * @property {number} [maxItems] - Maximum number of items to display\n * @example\n * const widgetProps = {\n * items: [pizzaListing, pastaListing],\n * featureDefinition: restaurantMenuDefinition,\n * colourBrandingMain: '#FF6363',\n * onItemPress: (item) => navigation.navigate('Detail', { listing: item }),\n * refreshing: false,\n * onRefresh: handleRefresh,\n * maxItems: 2\n * };\n */\n\n/**\n * @typedef {Object} ApiResponse\n * @property {boolean} success - Whether the API call was successful\n * @property {*} data - Response data payload\n * @property {string} [message] - Optional message from the server\n * @property {string} [error] - Error message if the call failed\n * @property {number} [status] - HTTP status code\n * @property {Object} [metadata] - Additional response metadata\n * @example\n * const apiResponse = {\n * success: true,\n * data: { listings: [pizzaListing, pastaListing] },\n * message: 'Listings fetched successfully',\n * status: 200,\n * metadata: { count: 2, hasMore: false }\n * };\n */\n\n/**\n * @typedef {Object} FieldComponentProps\n * @property {FieldDefinition} fieldDefinition - Field definition configuration\n * @property {*} value - Current field value\n * @property {Function} onChange - Callback when field value changes\n * @property {string} [error] - Validation error message\n * @property {boolean} [disabled] - Whether field is disabled\n * @property {Object} [style] - Additional styles for field component\n * @property {Object} [theme] - Theme configuration\n * @example\n * const fieldProps = {\n * fieldDefinition: titleField,\n * value: 'Margherita Pizza',\n * onChange: (newValue) => setFieldValue('title', newValue),\n * error: null,\n * disabled: false,\n * style: { marginBottom: 16 },\n * theme: { primaryColor: '#FF6363' }\n * };\n */\n\n/**\n * @typedef {Object} LayoutComponentProps\n * @property {Listing[]} listings - Array of listings to display\n * @property {FeatureDefinition} featureDefinition - Feature definition for layout configuration\n * @property {string} colourBrandingMain - Main branding color\n * @property {Function} onItemPress - Callback when listing item is pressed\n * @property {Function} [onRefresh] - Callback for pull-to-refresh\n * @property {boolean} [refreshing] - Whether layout is currently refreshing\n * @property {Object} [style] - Additional styles for layout component\n * @property {Object} [layoutOptions] - Layout-specific options\n * @example\n * const layoutProps = {\n * listings: [pizzaListing, pastaListing],\n * featureDefinition: restaurantMenuDefinition,\n * colourBrandingMain: '#FF6363',\n * onItemPress: handleItemPress,\n * refreshing: false,\n * onRefresh: handleRefresh,\n * layoutOptions: { showImages: true, columns: 2 }\n * };\n */\n\n// Export empty object to make this a module\nmodule.exports = {};\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACAA,MAAM,CAACC,OAAO,GAAG,CAAC,CAAC","ignoreList":[]}