@defra/forms-model 3.0.501 → 3.0.503

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 (42) hide show
  1. package/dist/module/__stubs__/pages.js +14 -1
  2. package/dist/module/__stubs__/pages.js.map +1 -1
  3. package/dist/module/form/form-editor/__stubs__/preview.js +7 -1
  4. package/dist/module/form/form-editor/__stubs__/preview.js.map +1 -1
  5. package/dist/module/form/form-editor/macros/types.js.map +1 -1
  6. package/dist/module/form/form-editor/preview/controller/guidance-page-controller.js +58 -0
  7. package/dist/module/form/form-editor/preview/controller/guidance-page-controller.js.map +1 -0
  8. package/dist/module/form/form-editor/preview/controller/page-controller-base.js +363 -0
  9. package/dist/module/form/form-editor/preview/controller/page-controller-base.js.map +1 -0
  10. package/dist/module/form/form-editor/preview/controller/page-controller.js +62 -186
  11. package/dist/module/form/form-editor/preview/controller/page-controller.js.map +1 -1
  12. package/dist/module/form/form-editor/preview/index.js +2 -0
  13. package/dist/module/form/form-editor/preview/index.js.map +1 -1
  14. package/dist/module/form/form-editor/preview/types.js.map +1 -1
  15. package/dist/module/pages/helpers.js +2 -1
  16. package/dist/module/pages/helpers.js.map +1 -1
  17. package/dist/types/__stubs__/pages.d.ts +14 -0
  18. package/dist/types/__stubs__/pages.d.ts.map +1 -1
  19. package/dist/types/form/form-editor/__stubs__/preview.d.ts +5 -1
  20. package/dist/types/form/form-editor/__stubs__/preview.d.ts.map +1 -1
  21. package/dist/types/form/form-editor/macros/types.d.ts +8 -0
  22. package/dist/types/form/form-editor/macros/types.d.ts.map +1 -1
  23. package/dist/types/form/form-editor/preview/controller/guidance-page-controller.d.ts +10 -0
  24. package/dist/types/form/form-editor/preview/controller/guidance-page-controller.d.ts.map +1 -0
  25. package/dist/types/form/form-editor/preview/controller/page-controller-base.d.ts +198 -0
  26. package/dist/types/form/form-editor/preview/controller/page-controller-base.d.ts.map +1 -0
  27. package/dist/types/form/form-editor/preview/controller/page-controller.d.ts +9 -114
  28. package/dist/types/form/form-editor/preview/controller/page-controller.d.ts.map +1 -1
  29. package/dist/types/form/form-editor/preview/index.d.ts +2 -0
  30. package/dist/types/form/form-editor/preview/types.d.ts +5 -1
  31. package/dist/types/form/form-editor/preview/types.d.ts.map +1 -1
  32. package/dist/types/pages/helpers.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/__stubs__/pages.ts +20 -1
  35. package/src/form/form-editor/__stubs__/preview.js +13 -1
  36. package/src/form/form-editor/macros/types.ts +8 -0
  37. package/src/form/form-editor/preview/controller/guidance-page-controller.js +64 -0
  38. package/src/form/form-editor/preview/controller/page-controller-base.js +388 -0
  39. package/src/form/form-editor/preview/controller/page-controller.js +67 -201
  40. package/src/form/form-editor/preview/index.js +2 -0
  41. package/src/form/form-editor/preview/types.ts +6 -1
  42. package/src/pages/helpers.ts +2 -1
@@ -1,4 +1,4 @@
1
- import { buildFileUploadComponent } from "./components.js";
1
+ import { buildFileUploadComponent, buildMarkdownComponent } from "./components.js";
2
2
  import { ComponentType } from "../components/enums.js";
3
3
  import { ControllerPath, ControllerType } from "../pages/enums.js";
4
4
 
@@ -17,6 +17,19 @@ export function buildQuestionPage(partialPage) {
17
17
  ...partialPage
18
18
  };
19
19
  }
20
+ export const GUIDANCE_PAGE_CONTENT = 'Lorem ipsum dolar sit amet';
21
+ export function buildGuidancePage(partialPage) {
22
+ return {
23
+ id: 'a3fc003b-d380-43e8-9b87-9ca48ac8447f',
24
+ title: 'Guidance page',
25
+ path: '/guidance-page',
26
+ next: [],
27
+ components: [buildMarkdownComponent({
28
+ content: 'Lorem ipsum dolar sit amet'
29
+ })],
30
+ ...partialPage
31
+ };
32
+ }
20
33
 
21
34
  /**
22
35
  * Stub builder for a Summary page
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","names":["buildFileUploadComponent","ComponentType","ControllerPath","ControllerType","buildQuestionPage","partialPage","id","title","path","next","components","buildSummaryPage","partialSummaryPage","Summary","controller","buildFileUploadPage","partialFileUploadPage","type","FileUploadField","name","shortDescription","hint","options","required","accept","FileUpload","buildRepeaterPage","partialRepeaterPage","TextField","schema","repeat","min","max","Repeat"],"sources":["../../../src/__stubs__/pages.ts"],"sourcesContent":["import { buildFileUploadComponent } from '~/src/__stubs__/components.js'\nimport { ComponentType } from '~/src/components/enums.js'\nimport {\n type PageFileUpload,\n type PageQuestion,\n type PageRepeat,\n type PageSummary\n} from '~/src/form/form-definition/types.js'\nimport { ControllerPath, ControllerType } from '~/src/pages/enums.js'\n\n/**\n * Stub builder for a question page\n * @param {Partial<PageQuestion>} [partialPage]\n * @returns {PageQuestion}\n */\nexport function buildQuestionPage(\n partialPage: Partial<PageQuestion>\n): PageQuestion {\n return {\n id: 'ffefd409-f3f4-49fe-882e-6e89f44631b1',\n title: 'Page One',\n path: '/page-one',\n next: [],\n components: [],\n ...partialPage\n }\n}\n\n/**\n * Stub builder for a Summary page\n * @param {Partial<PageSummary>} [partialSummaryPage]\n */\nexport function buildSummaryPage(\n partialSummaryPage: Partial<PageSummary> = {}\n): PageSummary {\n return {\n id: '449a45f6-4541-4a46-91bd-8b8931b07b50',\n title: 'Summary page',\n ...partialSummaryPage,\n path: ControllerPath.Summary,\n controller: ControllerType.Summary\n }\n}\n\n/**\n *\n * @param {Partial<PageFileUpload>} partialFileUploadPage\n * @returns {PageFileUpload}\n */\nexport function buildFileUploadPage(\n partialFileUploadPage: Partial<PageFileUpload> = {}\n): PageFileUpload {\n return {\n id: '85e5c8da-88f5-4009-a821-7d7de1364318',\n title: '',\n path: '/supporting-evidence',\n components: [\n buildFileUploadComponent({\n type: ComponentType.FileUploadField,\n title: 'Supporting Evidence',\n name: 'yBpZQO',\n shortDescription: 'Supporting evidence',\n hint: '',\n options: {\n required: true,\n accept:\n 'application/pdf,application/msword,image/jpeg,application/vnd.ms-excel,text/csv'\n },\n id: '4189b8a1-1a04-4f74-a7a0-dd23012a0ee0'\n })\n ],\n next: [],\n ...partialFileUploadPage,\n controller: ControllerType.FileUpload\n }\n}\n\n/**\n *\n * @param {Partial<PageRepeat>} partialRepeaterPage\n * @returns {PageRepeat}\n */\nexport function buildRepeaterPage(\n partialRepeaterPage: Partial<PageRepeat> = {}\n): PageRepeat {\n return {\n title: 'Repeater Page',\n path: '/repeater-page',\n components: [\n {\n type: ComponentType.TextField,\n title: 'Simple text field',\n name: 'IHAIzC',\n shortDescription: 'Your simple text field',\n hint: '',\n options: {},\n schema: {},\n id: 'ee83413e-31b6-4158-98e0-4611479582ce'\n }\n ],\n next: [],\n id: '32888028-61db-40fc-b255-80bc67829d31',\n repeat: {\n options: { name: 'fawfed', title: 'Simple question responses' },\n schema: { min: 1, max: 3 }\n },\n ...partialRepeaterPage,\n controller: ControllerType.Repeat\n }\n}\n"],"mappings":"AAAA,SAASA,wBAAwB;AACjC,SAASC,aAAa;AAOtB,SAASC,cAAc,EAAEC,cAAc;;AAEvC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,WAAkC,EACpB;EACd,OAAO;IACLC,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,UAAU;IACjBC,IAAI,EAAE,WAAW;IACjBC,IAAI,EAAE,EAAE;IACRC,UAAU,EAAE,EAAE;IACd,GAAGL;EACL,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASM,gBAAgBA,CAC9BC,kBAAwC,GAAG,CAAC,CAAC,EAChC;EACb,OAAO;IACLN,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,cAAc;IACrB,GAAGK,kBAAkB;IACrBJ,IAAI,EAAEN,cAAc,CAACW,OAAO;IAC5BC,UAAU,EAAEX,cAAc,CAACU;EAC7B,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,mBAAmBA,CACjCC,qBAA8C,GAAG,CAAC,CAAC,EACnC;EAChB,OAAO;IACLV,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,EAAE;IACTC,IAAI,EAAE,sBAAsB;IAC5BE,UAAU,EAAE,CACVV,wBAAwB,CAAC;MACvBiB,IAAI,EAAEhB,aAAa,CAACiB,eAAe;MACnCX,KAAK,EAAE,qBAAqB;MAC5BY,IAAI,EAAE,QAAQ;MACdC,gBAAgB,EAAE,qBAAqB;MACvCC,IAAI,EAAE,EAAE;MACRC,OAAO,EAAE;QACPC,QAAQ,EAAE,IAAI;QACdC,MAAM,EACJ;MACJ,CAAC;MACDlB,EAAE,EAAE;IACN,CAAC,CAAC,CACH;IACDG,IAAI,EAAE,EAAE;IACR,GAAGO,qBAAqB;IACxBF,UAAU,EAAEX,cAAc,CAACsB;EAC7B,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,mBAAwC,GAAG,CAAC,CAAC,EACjC;EACZ,OAAO;IACLpB,KAAK,EAAE,eAAe;IACtBC,IAAI,EAAE,gBAAgB;IACtBE,UAAU,EAAE,CACV;MACEO,IAAI,EAAEhB,aAAa,CAAC2B,SAAS;MAC7BrB,KAAK,EAAE,mBAAmB;MAC1BY,IAAI,EAAE,QAAQ;MACdC,gBAAgB,EAAE,wBAAwB;MAC1CC,IAAI,EAAE,EAAE;MACRC,OAAO,EAAE,CAAC,CAAC;MACXO,MAAM,EAAE,CAAC,CAAC;MACVvB,EAAE,EAAE;IACN,CAAC,CACF;IACDG,IAAI,EAAE,EAAE;IACRH,EAAE,EAAE,sCAAsC;IAC1CwB,MAAM,EAAE;MACNR,OAAO,EAAE;QAAEH,IAAI,EAAE,QAAQ;QAAEZ,KAAK,EAAE;MAA4B,CAAC;MAC/DsB,MAAM,EAAE;QAAEE,GAAG,EAAE,CAAC;QAAEC,GAAG,EAAE;MAAE;IAC3B,CAAC;IACD,GAAGL,mBAAmB;IACtBb,UAAU,EAAEX,cAAc,CAAC8B;EAC7B,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"pages.js","names":["buildFileUploadComponent","buildMarkdownComponent","ComponentType","ControllerPath","ControllerType","buildQuestionPage","partialPage","id","title","path","next","components","GUIDANCE_PAGE_CONTENT","buildGuidancePage","content","buildSummaryPage","partialSummaryPage","Summary","controller","buildFileUploadPage","partialFileUploadPage","type","FileUploadField","name","shortDescription","hint","options","required","accept","FileUpload","buildRepeaterPage","partialRepeaterPage","TextField","schema","repeat","min","max","Repeat"],"sources":["../../../src/__stubs__/pages.ts"],"sourcesContent":["import {\n buildFileUploadComponent,\n buildMarkdownComponent\n} from '~/src/__stubs__/components.js'\nimport { ComponentType } from '~/src/components/enums.js'\nimport {\n type PageFileUpload,\n type PageQuestion,\n type PageRepeat,\n type PageSummary\n} from '~/src/form/form-definition/types.js'\nimport { ControllerPath, ControllerType } from '~/src/pages/enums.js'\n\n/**\n * Stub builder for a question page\n * @param {Partial<PageQuestion>} [partialPage]\n * @returns {PageQuestion}\n */\nexport function buildQuestionPage(\n partialPage: Partial<PageQuestion>\n): PageQuestion {\n return {\n id: 'ffefd409-f3f4-49fe-882e-6e89f44631b1',\n title: 'Page One',\n path: '/page-one',\n next: [],\n components: [],\n ...partialPage\n }\n}\n\nexport const GUIDANCE_PAGE_CONTENT = 'Lorem ipsum dolar sit amet'\nexport function buildGuidancePage(partialPage: Partial<PageQuestion>) {\n return {\n id: 'a3fc003b-d380-43e8-9b87-9ca48ac8447f',\n title: 'Guidance page',\n path: '/guidance-page',\n next: [],\n components: [\n buildMarkdownComponent({\n content: 'Lorem ipsum dolar sit amet'\n })\n ],\n ...partialPage\n }\n}\n\n/**\n * Stub builder for a Summary page\n * @param {Partial<PageSummary>} [partialSummaryPage]\n */\nexport function buildSummaryPage(\n partialSummaryPage: Partial<PageSummary> = {}\n): PageSummary {\n return {\n id: '449a45f6-4541-4a46-91bd-8b8931b07b50',\n title: 'Summary page',\n ...partialSummaryPage,\n path: ControllerPath.Summary,\n controller: ControllerType.Summary\n }\n}\n\n/**\n *\n * @param {Partial<PageFileUpload>} partialFileUploadPage\n * @returns {PageFileUpload}\n */\nexport function buildFileUploadPage(\n partialFileUploadPage: Partial<PageFileUpload> = {}\n): PageFileUpload {\n return {\n id: '85e5c8da-88f5-4009-a821-7d7de1364318',\n title: '',\n path: '/supporting-evidence',\n components: [\n buildFileUploadComponent({\n type: ComponentType.FileUploadField,\n title: 'Supporting Evidence',\n name: 'yBpZQO',\n shortDescription: 'Supporting evidence',\n hint: '',\n options: {\n required: true,\n accept:\n 'application/pdf,application/msword,image/jpeg,application/vnd.ms-excel,text/csv'\n },\n id: '4189b8a1-1a04-4f74-a7a0-dd23012a0ee0'\n })\n ],\n next: [],\n ...partialFileUploadPage,\n controller: ControllerType.FileUpload\n }\n}\n\n/**\n *\n * @param {Partial<PageRepeat>} partialRepeaterPage\n * @returns {PageRepeat}\n */\nexport function buildRepeaterPage(\n partialRepeaterPage: Partial<PageRepeat> = {}\n): PageRepeat {\n return {\n title: 'Repeater Page',\n path: '/repeater-page',\n components: [\n {\n type: ComponentType.TextField,\n title: 'Simple text field',\n name: 'IHAIzC',\n shortDescription: 'Your simple text field',\n hint: '',\n options: {},\n schema: {},\n id: 'ee83413e-31b6-4158-98e0-4611479582ce'\n }\n ],\n next: [],\n id: '32888028-61db-40fc-b255-80bc67829d31',\n repeat: {\n options: { name: 'fawfed', title: 'Simple question responses' },\n schema: { min: 1, max: 3 }\n },\n ...partialRepeaterPage,\n controller: ControllerType.Repeat\n }\n}\n"],"mappings":"AAAA,SACEA,wBAAwB,EACxBC,sBAAsB;AAExB,SAASC,aAAa;AAOtB,SAASC,cAAc,EAAEC,cAAc;;AAEvC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,WAAkC,EACpB;EACd,OAAO;IACLC,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,UAAU;IACjBC,IAAI,EAAE,WAAW;IACjBC,IAAI,EAAE,EAAE;IACRC,UAAU,EAAE,EAAE;IACd,GAAGL;EACL,CAAC;AACH;AAEA,OAAO,MAAMM,qBAAqB,GAAG,4BAA4B;AACjE,OAAO,SAASC,iBAAiBA,CAACP,WAAkC,EAAE;EACpE,OAAO;IACLC,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,eAAe;IACtBC,IAAI,EAAE,gBAAgB;IACtBC,IAAI,EAAE,EAAE;IACRC,UAAU,EAAE,CACVV,sBAAsB,CAAC;MACrBa,OAAO,EAAE;IACX,CAAC,CAAC,CACH;IACD,GAAGR;EACL,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASS,gBAAgBA,CAC9BC,kBAAwC,GAAG,CAAC,CAAC,EAChC;EACb,OAAO;IACLT,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,cAAc;IACrB,GAAGQ,kBAAkB;IACrBP,IAAI,EAAEN,cAAc,CAACc,OAAO;IAC5BC,UAAU,EAAEd,cAAc,CAACa;EAC7B,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,mBAAmBA,CACjCC,qBAA8C,GAAG,CAAC,CAAC,EACnC;EAChB,OAAO;IACLb,EAAE,EAAE,sCAAsC;IAC1CC,KAAK,EAAE,EAAE;IACTC,IAAI,EAAE,sBAAsB;IAC5BE,UAAU,EAAE,CACVX,wBAAwB,CAAC;MACvBqB,IAAI,EAAEnB,aAAa,CAACoB,eAAe;MACnCd,KAAK,EAAE,qBAAqB;MAC5Be,IAAI,EAAE,QAAQ;MACdC,gBAAgB,EAAE,qBAAqB;MACvCC,IAAI,EAAE,EAAE;MACRC,OAAO,EAAE;QACPC,QAAQ,EAAE,IAAI;QACdC,MAAM,EACJ;MACJ,CAAC;MACDrB,EAAE,EAAE;IACN,CAAC,CAAC,CACH;IACDG,IAAI,EAAE,EAAE;IACR,GAAGU,qBAAqB;IACxBF,UAAU,EAAEd,cAAc,CAACyB;EAC7B,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,mBAAwC,GAAG,CAAC,CAAC,EACjC;EACZ,OAAO;IACLvB,KAAK,EAAE,eAAe;IACtBC,IAAI,EAAE,gBAAgB;IACtBE,UAAU,EAAE,CACV;MACEU,IAAI,EAAEnB,aAAa,CAAC8B,SAAS;MAC7BxB,KAAK,EAAE,mBAAmB;MAC1Be,IAAI,EAAE,QAAQ;MACdC,gBAAgB,EAAE,wBAAwB;MAC1CC,IAAI,EAAE,EAAE;MACRC,OAAO,EAAE,CAAC,CAAC;MACXO,MAAM,EAAE,CAAC,CAAC;MACV1B,EAAE,EAAE;IACN,CAAC,CACF;IACDG,IAAI,EAAE,EAAE;IACRH,EAAE,EAAE,sCAAsC;IAC1C2B,MAAM,EAAE;MACNR,OAAO,EAAE;QAAEH,IAAI,EAAE,QAAQ;QAAEf,KAAK,EAAE;MAA4B,CAAC;MAC/DyB,MAAM,EAAE;QAAEE,GAAG,EAAE,CAAC;QAAEC,GAAG,EAAE;MAAE;IAC3B,CAAC;IACD,GAAGL,mBAAmB;IACtBb,UAAU,EAAEd,cAAc,CAACiC;EAC7B,CAAC;AACH","ignoreList":[]}
@@ -169,16 +169,22 @@ export class PagePreviewElements {
169
169
  guidance;
170
170
  heading;
171
171
  addHeading;
172
+ repeatQuestion;
173
+ hasRepeater;
172
174
 
173
175
  /**
174
176
  * @param {string} heading
175
177
  * @param {string} guidance
176
178
  * @param {boolean} [addHeading]
179
+ * @param {string} repeatQuestion
180
+ * @param {boolean} hasRepeater
177
181
  */
178
- constructor(heading, guidance = '', addHeading = undefined) {
182
+ constructor(heading, guidance = '', addHeading = undefined, repeatQuestion = '', hasRepeater = false) {
179
183
  this.heading = heading;
180
184
  this.guidance = guidance;
181
185
  this.addHeading = addHeading ?? heading.length > 0;
186
+ this.repeatQuestion = repeatQuestion;
187
+ this.hasRepeater = hasRepeater;
182
188
  }
183
189
  }
184
190
  export const baseElements = /** @type {BaseSettings} */{
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","names":["Question","QuestionRendererStub","renderMock","constructor","render","questionTemplate","questionBaseModel","buildHTML","_questionTemplate","_renderContext","PageRendererStub","pageTemplate","pagePreviewPanelMacro","QuestionPreviewElements","_question","_hintText","_optional","_shortDesc","_content","_items","afterInputsHTML","question","hintText","optional","shortDesc","items","content","values","setPreviewHTML","_value","setPreviewDOM","AutocompletePreviewElements","autocompleteOptions","elements","PagePreviewElements","guidance","heading","addHeading","undefined","length","baseElements","largeTitle","list1Id","list2Id","list3Id","list4Id","listElementsBase","label","text","value","id","listElementsStub","buildPreviewShortAnswer","partialBaseElements"],"sources":["../../../../../src/form/form-editor/__stubs__/preview.js"],"sourcesContent":["import { Question } from '~/src/form/form-editor/preview/question.js'\n\n/**\n * @implements {QuestionRenderer}\n */\nexport class QuestionRendererStub {\n /**\n * @type {jest.Mock<void, [string, QuestionBaseModel]>}\n */\n renderMock\n\n /**\n * @param {jest.Mock<void, [string, QuestionBaseModel]>} renderMock\n */\n constructor(renderMock) {\n this.renderMock = renderMock\n }\n\n /**\n * @param {string} questionTemplate\n * @param {QuestionBaseModel} questionBaseModel\n */\n render(questionTemplate, questionBaseModel) {\n this.renderMock(questionTemplate, questionBaseModel)\n }\n\n /**\n * @returns {string}\n * @param {string} _questionTemplate\n * @param {RenderContext} _renderContext\n */\n static buildHTML(_questionTemplate, _renderContext) {\n return '**** BUILT HTML ****'\n }\n}\n\n/**\n * @implements {PageRenderer}\n */\nexport class PageRendererStub {\n /**\n * @type {jest.Mock<void, [string, PagePreviewPanelMacro]>}\n */\n renderMock\n\n /**\n * @param {jest.Mock<void, [string, PagePreviewPanelMacro]>} renderMock\n */\n constructor(renderMock) {\n this.renderMock = renderMock\n }\n\n /**\n * @param {string} pageTemplate\n * @param {PagePreviewPanelMacro} pagePreviewPanelMacro\n */\n render(pageTemplate, pagePreviewPanelMacro) {\n this.renderMock(pageTemplate, pagePreviewPanelMacro)\n }\n\n /**\n * @returns {string}\n * @param {string} _questionTemplate\n * @param {RenderContext} _renderContext\n */\n static buildHTML(_questionTemplate, _renderContext) {\n return '**** BUILT HTML ****'\n }\n}\n\n/**\n * @implements {ListElements}\n */\nexport class QuestionPreviewElements {\n /**\n * @protected\n */\n _question = ''\n /** @protected */\n _hintText = ''\n /** @protected */\n _optional = false\n /**\n * @type {string}\n * @protected\n */\n _shortDesc = ''\n /**\n * @type {string}\n * @protected\n */\n _content = ''\n /**\n *\n * @type {ListElement[]}\n * @private\n */\n _items = []\n afterInputsHTML = '<div class=\"govuk-inset-text\">No items added yet.</div>'\n\n /**\n * @param {BaseSettings} baseSettings\n */\n constructor({ question, hintText, optional, shortDesc, items, content }) {\n this._question = question\n this._hintText = hintText\n this._optional = optional\n this._shortDesc = shortDesc\n this._items = items\n this._content = content\n }\n\n /**\n * @returns {BaseSettings}\n */\n get values() {\n return {\n question: this._question,\n hintText: this._hintText,\n optional: this._optional,\n shortDesc: this._shortDesc,\n items: this._items,\n content: this._content\n }\n }\n\n /**\n * @param {string} _value\n */\n setPreviewHTML(_value) {\n // Not implemented for server side render\n }\n\n /**\n * @param {HTMLElement} _value\n */\n setPreviewDOM(_value) {\n // Not implemented for server side render\n }\n}\n\n/**\n * @implements {AutocompleteElements}\n */\nexport class AutocompletePreviewElements extends QuestionPreviewElements {\n /**\n * @param {BaseSettings & {autocompleteOptions: string}} elements\n */\n constructor({ autocompleteOptions, ...elements }) {\n super(elements)\n this.autocompleteOptions = autocompleteOptions\n }\n}\n\n/**\n * @implements {PageOverviewElements}\n */\nexport class PagePreviewElements {\n guidance\n heading\n addHeading\n\n /**\n * @param {string} heading\n * @param {string} guidance\n * @param {boolean} [addHeading]\n */\n constructor(heading, guidance = '', addHeading = undefined) {\n this.heading = heading\n this.guidance = guidance\n this.addHeading = addHeading ?? heading.length > 0\n }\n}\n\nexport const baseElements = /** @type {BaseSettings} */ ({\n items: [],\n optional: false,\n question: 'Which quest would you like to pick?',\n hintText: 'Choose one adventure that best suits you.',\n shortDesc: '',\n content: '',\n largeTitle: true\n})\n\nconst list1Id = '414d82a3-4cab-416a-bd54-6b86fbd51120'\nconst list2Id = '801385a4-81e6-4171-96c3-6c6727d97f22'\nconst list3Id = 'e6e3f621-b875-4ca3-a054-cca9149149dd'\nconst list4Id = 'd71b3909-582f-4e90-b6f5-490b89a6eb8f'\n\nconst listElementsBase = /** @type {BaseSettings} */ ({\n ...baseElements,\n items: [\n {\n label: { text: 'Treasure Hunting' },\n text: 'Treasure Hunting',\n value: 'Treasure Hunting',\n id: list1Id\n },\n {\n label: { text: 'Rescuing the princess' },\n text: 'Rescuing the princess',\n value: 'Rescuing the princess',\n id: list2Id\n },\n {\n label: { text: 'Saving a city' },\n text: 'Saving a city',\n value: 'Saving a city',\n id: list3Id\n },\n {\n label: { text: 'Defeating the baron' },\n text: 'Defeating the baron',\n value: 'Defeating the baron',\n id: list4Id\n }\n ]\n})\n\nexport const listElementsStub = {\n list1Id,\n list2Id,\n list3Id,\n list4Id,\n baseElements: listElementsBase\n}\n\n/**\n * @param {Partial<BaseSettings>} partialBaseElements\n * @param {jest.Mock<void, [string, QuestionBaseModel]>} renderMock\n * @returns {Question}\n */\nexport function buildPreviewShortAnswer(partialBaseElements, renderMock) {\n return new Question(\n new QuestionPreviewElements({\n ...baseElements,\n ...partialBaseElements\n }),\n new QuestionRendererStub(renderMock)\n )\n}\n\n/**\n * @import { ListElement } from '~/src/form/form-editor/types.js'\n * @import { PagePreviewPanelMacro } from '~/src/form/form-editor/macros/types.js'\n * @import { BaseSettings, ListElements, RenderContext, QuestionBaseModel, QuestionElements, QuestionRenderer, AutocompleteElements, PageOverviewElements, PageRenderer } from '~/src/form/form-editor/preview/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"preview.js","names":["Question","QuestionRendererStub","renderMock","constructor","render","questionTemplate","questionBaseModel","buildHTML","_questionTemplate","_renderContext","PageRendererStub","pageTemplate","pagePreviewPanelMacro","QuestionPreviewElements","_question","_hintText","_optional","_shortDesc","_content","_items","afterInputsHTML","question","hintText","optional","shortDesc","items","content","values","setPreviewHTML","_value","setPreviewDOM","AutocompletePreviewElements","autocompleteOptions","elements","PagePreviewElements","guidance","heading","addHeading","repeatQuestion","hasRepeater","undefined","length","baseElements","largeTitle","list1Id","list2Id","list3Id","list4Id","listElementsBase","label","text","value","id","listElementsStub","buildPreviewShortAnswer","partialBaseElements"],"sources":["../../../../../src/form/form-editor/__stubs__/preview.js"],"sourcesContent":["import { Question } from '~/src/form/form-editor/preview/question.js'\n\n/**\n * @implements {QuestionRenderer}\n */\nexport class QuestionRendererStub {\n /**\n * @type {jest.Mock<void, [string, QuestionBaseModel]>}\n */\n renderMock\n\n /**\n * @param {jest.Mock<void, [string, QuestionBaseModel]>} renderMock\n */\n constructor(renderMock) {\n this.renderMock = renderMock\n }\n\n /**\n * @param {string} questionTemplate\n * @param {QuestionBaseModel} questionBaseModel\n */\n render(questionTemplate, questionBaseModel) {\n this.renderMock(questionTemplate, questionBaseModel)\n }\n\n /**\n * @returns {string}\n * @param {string} _questionTemplate\n * @param {RenderContext} _renderContext\n */\n static buildHTML(_questionTemplate, _renderContext) {\n return '**** BUILT HTML ****'\n }\n}\n\n/**\n * @implements {PageRenderer}\n */\nexport class PageRendererStub {\n /**\n * @type {jest.Mock<void, [string, PagePreviewPanelMacro]>}\n */\n renderMock\n\n /**\n * @param {jest.Mock<void, [string, PagePreviewPanelMacro]>} renderMock\n */\n constructor(renderMock) {\n this.renderMock = renderMock\n }\n\n /**\n * @param {string} pageTemplate\n * @param {PagePreviewPanelMacro} pagePreviewPanelMacro\n */\n render(pageTemplate, pagePreviewPanelMacro) {\n this.renderMock(pageTemplate, pagePreviewPanelMacro)\n }\n\n /**\n * @returns {string}\n * @param {string} _questionTemplate\n * @param {RenderContext} _renderContext\n */\n static buildHTML(_questionTemplate, _renderContext) {\n return '**** BUILT HTML ****'\n }\n}\n\n/**\n * @implements {ListElements}\n */\nexport class QuestionPreviewElements {\n /**\n * @protected\n */\n _question = ''\n /** @protected */\n _hintText = ''\n /** @protected */\n _optional = false\n /**\n * @type {string}\n * @protected\n */\n _shortDesc = ''\n /**\n * @type {string}\n * @protected\n */\n _content = ''\n /**\n *\n * @type {ListElement[]}\n * @private\n */\n _items = []\n afterInputsHTML = '<div class=\"govuk-inset-text\">No items added yet.</div>'\n\n /**\n * @param {BaseSettings} baseSettings\n */\n constructor({ question, hintText, optional, shortDesc, items, content }) {\n this._question = question\n this._hintText = hintText\n this._optional = optional\n this._shortDesc = shortDesc\n this._items = items\n this._content = content\n }\n\n /**\n * @returns {BaseSettings}\n */\n get values() {\n return {\n question: this._question,\n hintText: this._hintText,\n optional: this._optional,\n shortDesc: this._shortDesc,\n items: this._items,\n content: this._content\n }\n }\n\n /**\n * @param {string} _value\n */\n setPreviewHTML(_value) {\n // Not implemented for server side render\n }\n\n /**\n * @param {HTMLElement} _value\n */\n setPreviewDOM(_value) {\n // Not implemented for server side render\n }\n}\n\n/**\n * @implements {AutocompleteElements}\n */\nexport class AutocompletePreviewElements extends QuestionPreviewElements {\n /**\n * @param {BaseSettings & {autocompleteOptions: string}} elements\n */\n constructor({ autocompleteOptions, ...elements }) {\n super(elements)\n this.autocompleteOptions = autocompleteOptions\n }\n}\n\n/**\n * @implements {PageOverviewElements}\n */\nexport class PagePreviewElements {\n guidance\n heading\n addHeading\n repeatQuestion\n hasRepeater\n\n /**\n * @param {string} heading\n * @param {string} guidance\n * @param {boolean} [addHeading]\n * @param {string} repeatQuestion\n * @param {boolean} hasRepeater\n */\n constructor(\n heading,\n guidance = '',\n addHeading = undefined,\n repeatQuestion = '',\n hasRepeater = false\n ) {\n this.heading = heading\n this.guidance = guidance\n this.addHeading = addHeading ?? heading.length > 0\n this.repeatQuestion = repeatQuestion\n this.hasRepeater = hasRepeater\n }\n}\n\nexport const baseElements = /** @type {BaseSettings} */ ({\n items: [],\n optional: false,\n question: 'Which quest would you like to pick?',\n hintText: 'Choose one adventure that best suits you.',\n shortDesc: '',\n content: '',\n largeTitle: true\n})\n\nconst list1Id = '414d82a3-4cab-416a-bd54-6b86fbd51120'\nconst list2Id = '801385a4-81e6-4171-96c3-6c6727d97f22'\nconst list3Id = 'e6e3f621-b875-4ca3-a054-cca9149149dd'\nconst list4Id = 'd71b3909-582f-4e90-b6f5-490b89a6eb8f'\n\nconst listElementsBase = /** @type {BaseSettings} */ ({\n ...baseElements,\n items: [\n {\n label: { text: 'Treasure Hunting' },\n text: 'Treasure Hunting',\n value: 'Treasure Hunting',\n id: list1Id\n },\n {\n label: { text: 'Rescuing the princess' },\n text: 'Rescuing the princess',\n value: 'Rescuing the princess',\n id: list2Id\n },\n {\n label: { text: 'Saving a city' },\n text: 'Saving a city',\n value: 'Saving a city',\n id: list3Id\n },\n {\n label: { text: 'Defeating the baron' },\n text: 'Defeating the baron',\n value: 'Defeating the baron',\n id: list4Id\n }\n ]\n})\n\nexport const listElementsStub = {\n list1Id,\n list2Id,\n list3Id,\n list4Id,\n baseElements: listElementsBase\n}\n\n/**\n * @param {Partial<BaseSettings>} partialBaseElements\n * @param {jest.Mock<void, [string, QuestionBaseModel]>} renderMock\n * @returns {Question}\n */\nexport function buildPreviewShortAnswer(partialBaseElements, renderMock) {\n return new Question(\n new QuestionPreviewElements({\n ...baseElements,\n ...partialBaseElements\n }),\n new QuestionRendererStub(renderMock)\n )\n}\n\n/**\n * @import { ListElement } from '~/src/form/form-editor/types.js'\n * @import { PagePreviewPanelMacro } from '~/src/form/form-editor/macros/types.js'\n * @import { BaseSettings, ListElements, RenderContext, QuestionBaseModel, QuestionElements, QuestionRenderer, AutocompleteElements, PageOverviewElements, PageRenderer } from '~/src/form/form-editor/preview/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../../src/form/form-editor/macros/types.ts"],"sourcesContent":["import { type ComponentType } from '~/src/components/enums.js'\nimport {\n type DateItem,\n type GovukField,\n type ListItemReadonly\n} from '~/src/form/form-editor/types.js'\nimport { type DefaultComponent, type GovukFieldset } from '~/src/index.js'\n\nexport interface AppPreviewErrorPanelMacroErrorTemplate {\n advancedSettingsErrors: []\n baseErrors: { template: unknown; type: string }[]\n}\n\nexport interface AppPreviewErrorPanelMacro {\n errorTemplates: AppPreviewErrorPanelMacroErrorTemplate\n fieldDetails: {\n extraFields: GovukField[]\n basePageFields: GovukField[]\n }\n questionType: ComponentType\n}\n\nexport interface AppPreviewPanelTabsMacro {\n questionType: ComponentType\n previewPageUrl: string\n previewErrorsUrl: string\n errorTemplates: AppPreviewErrorPanelMacroErrorTemplate\n extraFields: GovukField[]\n basePageFields: GovukField[]\n}\n\nexport interface SelectAfterInput {\n afterInput: { html: string }\n}\nexport interface RadioAndCheckboxAfterInputs {\n afterInputs: { html: string }\n}\n\n// GDS components - Select uses afterInput, while Radio uses afterInputs\nexport type FormGroupAfterInput = SelectAfterInput | RadioAndCheckboxAfterInputs\n\nexport interface QuestionBaseModel {\n id?: string\n name?: string\n content?: string\n attributes?: Record<string, string>\n label?: DefaultComponent\n hint?: DefaultComponent\n fieldset?: GovukFieldset\n readonly items?: ListItemReadonly[] | DateItem[]\n text?: string\n formGroup?: FormGroupAfterInput\n type?: 'text' | 'number' | 'boolean'\n classes?: string\n}\n\nexport interface AppPreviewPanelMacro extends AppPreviewPanelTabsMacro {\n model: QuestionBaseModel\n}\n\nexport interface PagePreviewComponent {\n model: QuestionBaseModel\n questionType: ComponentType\n}\n\nexport interface PagePreviewPanelMacro {\n readonly pageTitle: {\n text: string\n classes: string\n }\n readonly guidance: {\n text: string\n classes: string\n }\n readonly components: PagePreviewComponent[]\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../../src/form/form-editor/macros/types.ts"],"sourcesContent":["import { type ComponentType } from '~/src/components/enums.js'\nimport {\n type DateItem,\n type GovukField,\n type ListItemReadonly\n} from '~/src/form/form-editor/types.js'\nimport { type DefaultComponent, type GovukFieldset } from '~/src/index.js'\n\nexport interface AppPreviewErrorPanelMacroErrorTemplate {\n advancedSettingsErrors: []\n baseErrors: { template: unknown; type: string }[]\n}\n\nexport interface AppPreviewErrorPanelMacro {\n errorTemplates: AppPreviewErrorPanelMacroErrorTemplate\n fieldDetails: {\n extraFields: GovukField[]\n basePageFields: GovukField[]\n }\n questionType: ComponentType\n}\n\nexport interface AppPreviewPanelTabsMacro {\n questionType: ComponentType\n previewPageUrl: string\n previewErrorsUrl: string\n errorTemplates: AppPreviewErrorPanelMacroErrorTemplate\n extraFields: GovukField[]\n basePageFields: GovukField[]\n}\n\nexport interface SelectAfterInput {\n afterInput: { html: string }\n}\nexport interface RadioAndCheckboxAfterInputs {\n afterInputs: { html: string }\n}\n\n// GDS components - Select uses afterInput, while Radio uses afterInputs\nexport type FormGroupAfterInput = SelectAfterInput | RadioAndCheckboxAfterInputs\n\nexport interface QuestionBaseModel {\n id?: string\n name?: string\n content?: string\n attributes?: Record<string, string>\n label?: DefaultComponent\n hint?: DefaultComponent\n fieldset?: GovukFieldset\n readonly items?: ListItemReadonly[] | DateItem[]\n text?: string\n formGroup?: FormGroupAfterInput\n type?: 'text' | 'number' | 'boolean'\n classes?: string\n}\n\nexport interface AppPreviewPanelMacro extends AppPreviewPanelTabsMacro {\n model: QuestionBaseModel\n}\n\nexport interface PagePreviewComponent {\n model: QuestionBaseModel\n questionType: ComponentType\n}\n\nexport interface PagePreviewPanelMacro {\n readonly pageTitle: {\n text: string\n classes: string\n }\n readonly guidance: {\n text: string\n classes: string\n }\n readonly components: PagePreviewComponent[]\n readonly sectionTitle?: {\n text: string\n classes: string\n }\n readonly repeaterButton?: {\n text: string\n classes: string\n }\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ import { PreviewPageControllerBase } from "./page-controller-base.js";
2
+ const FALLBACK_GUIDANCE_TEXT = 'Guidance text';
3
+ export class GuidancePageController extends PreviewPageControllerBase {
4
+ /**
5
+ * @type {Markdown}
6
+ * @protected
7
+ */
8
+ _unhighlightedEmptyGuidance = PreviewPageControllerBase.createGuidanceComponent(false);
9
+
10
+ /**
11
+ * @type {Markdown}
12
+ * @protected
13
+ */
14
+ _guidanceComponent = PreviewPageControllerBase.createGuidanceComponent(false);
15
+
16
+ /**
17
+ * @param {PagePreviewBaseElements} elements
18
+ * @param {PageRenderer} renderer
19
+ */
20
+ constructor(elements, renderer) {
21
+ super(elements, renderer);
22
+ if (elements.guidance.length) {
23
+ this._guidanceComponent.content = elements.guidance;
24
+ }
25
+ }
26
+
27
+ /**
28
+ * @returns {Markdown[]}
29
+ * @protected
30
+ */
31
+ _getGuidanceComponents() {
32
+ if (this._guidanceText.length) {
33
+ return [this._guidanceComponent];
34
+ }
35
+ if (this._isHighlighted(PreviewPageControllerBase.HighlightClass.GUIDANCE)) {
36
+ return [this._emptyGuidance];
37
+ }
38
+ return [this._unhighlightedEmptyGuidance];
39
+ }
40
+
41
+ /**
42
+ * @returns {string}
43
+ * @protected
44
+ */
45
+ _getGuidanceText() {
46
+ const guidanceText = super._getGuidanceText();
47
+ if (!guidanceText.length) {
48
+ return FALLBACK_GUIDANCE_TEXT;
49
+ }
50
+ return super._getGuidanceText();
51
+ }
52
+ }
53
+
54
+ /**
55
+ * @import { Markdown } from '~/src/form/form-editor/preview/markdown.js'
56
+ * @import { PageRenderer, PagePreviewBaseElements } from '~/src/form/form-editor/preview/types.js'
57
+ */
58
+ //# sourceMappingURL=guidance-page-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidance-page-controller.js","names":["PreviewPageControllerBase","FALLBACK_GUIDANCE_TEXT","GuidancePageController","_unhighlightedEmptyGuidance","createGuidanceComponent","_guidanceComponent","constructor","elements","renderer","guidance","length","content","_getGuidanceComponents","_guidanceText","_isHighlighted","HighlightClass","GUIDANCE","_emptyGuidance","_getGuidanceText","guidanceText"],"sources":["../../../../../../src/form/form-editor/preview/controller/guidance-page-controller.js"],"sourcesContent":["import { PreviewPageControllerBase } from '~/src/form/form-editor/preview/controller/page-controller-base.js'\n\nconst FALLBACK_GUIDANCE_TEXT = 'Guidance text'\n\nexport class GuidancePageController extends PreviewPageControllerBase {\n /**\n * @type {Markdown}\n * @protected\n */\n _unhighlightedEmptyGuidance =\n PreviewPageControllerBase.createGuidanceComponent(false)\n\n /**\n * @type {Markdown}\n * @protected\n */\n _guidanceComponent = PreviewPageControllerBase.createGuidanceComponent(false)\n\n /**\n * @param {PagePreviewBaseElements} elements\n * @param {PageRenderer} renderer\n */\n constructor(elements, renderer) {\n super(elements, renderer)\n if (elements.guidance.length) {\n this._guidanceComponent.content = elements.guidance\n }\n }\n\n /**\n * @returns {Markdown[]}\n * @protected\n */\n _getGuidanceComponents() {\n if (this._guidanceText.length) {\n return [this._guidanceComponent]\n }\n\n if (\n this._isHighlighted(PreviewPageControllerBase.HighlightClass.GUIDANCE)\n ) {\n return [this._emptyGuidance]\n }\n\n return [this._unhighlightedEmptyGuidance]\n }\n\n /**\n * @returns {string}\n * @protected\n */\n _getGuidanceText() {\n const guidanceText = super._getGuidanceText()\n if (!guidanceText.length) {\n return FALLBACK_GUIDANCE_TEXT\n }\n return super._getGuidanceText()\n }\n}\n\n/**\n * @import { Markdown } from '~/src/form/form-editor/preview/markdown.js'\n * @import { PageRenderer, PagePreviewBaseElements } from '~/src/form/form-editor/preview/types.js'\n */\n"],"mappings":"AAAA,SAASA,yBAAyB;AAElC,MAAMC,sBAAsB,GAAG,eAAe;AAE9C,OAAO,MAAMC,sBAAsB,SAASF,yBAAyB,CAAC;EACpE;AACF;AACA;AACA;EACEG,2BAA2B,GACzBH,yBAAyB,CAACI,uBAAuB,CAAC,KAAK,CAAC;;EAE1D;AACF;AACA;AACA;EACEC,kBAAkB,GAAGL,yBAAyB,CAACI,uBAAuB,CAAC,KAAK,CAAC;;EAE7E;AACF;AACA;AACA;EACEE,WAAWA,CAACC,QAAQ,EAAEC,QAAQ,EAAE;IAC9B,KAAK,CAACD,QAAQ,EAAEC,QAAQ,CAAC;IACzB,IAAID,QAAQ,CAACE,QAAQ,CAACC,MAAM,EAAE;MAC5B,IAAI,CAACL,kBAAkB,CAACM,OAAO,GAAGJ,QAAQ,CAACE,QAAQ;IACrD;EACF;;EAEA;AACF;AACA;AACA;EACEG,sBAAsBA,CAAA,EAAG;IACvB,IAAI,IAAI,CAACC,aAAa,CAACH,MAAM,EAAE;MAC7B,OAAO,CAAC,IAAI,CAACL,kBAAkB,CAAC;IAClC;IAEA,IACE,IAAI,CAACS,cAAc,CAACd,yBAAyB,CAACe,cAAc,CAACC,QAAQ,CAAC,EACtE;MACA,OAAO,CAAC,IAAI,CAACC,cAAc,CAAC;IAC9B;IAEA,OAAO,CAAC,IAAI,CAACd,2BAA2B,CAAC;EAC3C;;EAEA;AACF;AACA;AACA;EACEe,gBAAgBA,CAAA,EAAG;IACjB,MAAMC,YAAY,GAAG,KAAK,CAACD,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAACC,YAAY,CAACT,MAAM,EAAE;MACxB,OAAOT,sBAAsB;IAC/B;IACA,OAAO,KAAK,CAACiB,gBAAgB,CAAC,CAAC;EACjC;AACF;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,363 @@
1
+ import { ComponentType } from "../../../../components/enums.js";
2
+ import { HIGHLIGHT_CLASS } from "../constants.js";
3
+ import { ContentElements } from "../content.js";
4
+ import { Markdown } from "../markdown.js";
5
+ import { hasComponents, hasRepeater } from "../../../../pages/helpers.js";
6
+
7
+ /**
8
+ * @type {QuestionRenderer}
9
+ */
10
+ const questionRenderer = {
11
+ /**
12
+ * @param {string} _questionTemplate
13
+ * @param {QuestionBaseModel} _questionBaseModel
14
+ */
15
+ render(_questionTemplate, _questionBaseModel) {
16
+ //
17
+ }
18
+ };
19
+ /**
20
+ * Enum for Highlight classes
21
+ * @readonly
22
+ * @enum {string}
23
+ */
24
+ const HighlightClass = {
25
+ TITLE: 'title',
26
+ GUIDANCE: 'guidance',
27
+ REPEATER: 'repeater'
28
+ };
29
+
30
+ /**
31
+ * @implements {PageOverviewElements}
32
+ */
33
+ export class PagePreviewElements {
34
+ /**
35
+ * @type {Page | { title: string }}
36
+ * @private
37
+ */
38
+ _page = {
39
+ title: ''
40
+ };
41
+
42
+ /**
43
+ * @param {Page|undefined} page
44
+ */
45
+ constructor(page) {
46
+ if (page !== undefined) {
47
+ this._page = page;
48
+ }
49
+ }
50
+ get heading() {
51
+ return this._page.title;
52
+ }
53
+ get guidance() {
54
+ if (!hasComponents(this._page) || !this._page.components.length) {
55
+ return '';
56
+ }
57
+ const [possibleGuidanceComponent] = this._page.components;
58
+ return possibleGuidanceComponent.type === ComponentType.Markdown ? possibleGuidanceComponent.content : '';
59
+ }
60
+ get addHeading() {
61
+ return this._page.title.length > 0;
62
+ }
63
+ get repeatQuestion() {
64
+ if (hasRepeater(this._page)) {
65
+ return this._page.repeat.options.title;
66
+ }
67
+ return undefined;
68
+ }
69
+ get hasRepeater() {
70
+ return hasRepeater(this._page);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * @abstract
76
+ * @implements {PagePreviewPanelMacro}
77
+ */
78
+ export class PreviewPageControllerBase {
79
+ static PATH = 'preview-controllers/';
80
+ /**
81
+ * @type {string}
82
+ * @protected
83
+ */
84
+ _pageTemplate = PreviewPageControllerBase.PATH + 'page-controller.njk';
85
+ /**
86
+ * @protected
87
+ * @type {Question[]}
88
+ */
89
+ _components = [];
90
+ /**
91
+ * @type {boolean}
92
+ * @protected
93
+ */
94
+ _showTitle = true;
95
+ /**
96
+ * @protected
97
+ * @type {string}
98
+ */
99
+ _title = '';
100
+ /**
101
+ *
102
+ * @type {PageRenderer}
103
+ */
104
+ #pageRenderer;
105
+ /**
106
+ * @type { undefined | HighlightClass }
107
+ * @protected
108
+ */
109
+ _highlighted = undefined;
110
+ /**
111
+ * @type {string}
112
+ * @protected
113
+ */
114
+ _guidanceText = '';
115
+ /**
116
+ * @type { string }
117
+ * @protected
118
+ */
119
+ _sectionTitle = '';
120
+ /**
121
+ * @type {Markdown}
122
+ * @protected
123
+ */
124
+ _emptyGuidance = PreviewPageControllerBase.createGuidanceComponent();
125
+ /**
126
+ * @type {Markdown}
127
+ * @protected
128
+ */
129
+ _guidanceComponent = PreviewPageControllerBase.createGuidanceComponent();
130
+ /**
131
+ * @protected
132
+ * @type {boolean}
133
+ */
134
+ _isRepeater = false;
135
+
136
+ /**
137
+ * @param {PagePreviewBaseElements} elements
138
+ * @param {PageRenderer} renderer
139
+ */
140
+ constructor(elements, renderer) {
141
+ this._guidanceText = elements.guidance;
142
+ this.#pageRenderer = renderer;
143
+ this._title = elements.heading;
144
+ }
145
+
146
+ /**
147
+ * @type {typeof HighlightClass}
148
+ */
149
+ static HighlightClass = HighlightClass;
150
+
151
+ /**
152
+ * @returns {Markdown[]}
153
+ * @protected
154
+ */
155
+ _getGuidanceComponents() {
156
+ if (this._guidanceText.length) {
157
+ return [this._guidanceComponent];
158
+ }
159
+ if (this._highlighted === 'guidance') {
160
+ return [this._emptyGuidance];
161
+ }
162
+ return [];
163
+ }
164
+
165
+ /**
166
+ * @returns {Markdown[]}
167
+ * @protected
168
+ */
169
+ get _guidanceComponents() {
170
+ return this._getGuidanceComponents();
171
+ }
172
+
173
+ /**
174
+ * @returns {PagePreviewComponent[]}
175
+ */
176
+ get components() {
177
+ const componentsWithGuidance = /** @type {Question[]} */[...this._guidanceComponents, ...this._components];
178
+ return componentsWithGuidance.map(component => {
179
+ return {
180
+ model: component.renderInput,
181
+ questionType: component.componentType
182
+ };
183
+ });
184
+ }
185
+
186
+ /**
187
+ * @returns {string}
188
+ * @protected
189
+ */
190
+ _getGuidanceText() {
191
+ return this._guidanceText;
192
+ }
193
+ set guidanceText(text) {
194
+ this._guidanceText = text;
195
+ this._guidanceComponent.content = text;
196
+ this.render();
197
+ }
198
+
199
+ /**
200
+ * @returns {string}
201
+ */
202
+ get guidanceText() {
203
+ return this._getGuidanceText();
204
+ }
205
+ get guidance() {
206
+ return {
207
+ text: this.guidanceText,
208
+ classes: this._isHighlighted(HighlightClass.GUIDANCE)
209
+ };
210
+ }
211
+
212
+ /**
213
+ * @param {boolean} showTitle
214
+ */
215
+ set showTitle(showTitle) {
216
+ this._showTitle = showTitle;
217
+ this.render();
218
+ }
219
+ get showTitle() {
220
+ return this._showTitle;
221
+ }
222
+
223
+ /**
224
+ * @returns {{ text: string, classes: string }}
225
+ */
226
+ get pageTitle() {
227
+ return {
228
+ text: this.title,
229
+ classes: this._isHighlighted(HighlightClass.TITLE)
230
+ };
231
+ }
232
+ setRepeater() {
233
+ this._isRepeater = true;
234
+ this.render();
235
+ }
236
+ unsetRepeater() {
237
+ this._isRepeater = false;
238
+ this.render();
239
+ }
240
+ get isRepeater() {
241
+ return this._isRepeater;
242
+ }
243
+ render() {
244
+ this.#pageRenderer.render(this._pageTemplate, this);
245
+ }
246
+
247
+ /**
248
+ * @returns {string}
249
+ * @protected
250
+ */
251
+ _getTitle() {
252
+ if (this._title.length) {
253
+ return this._title;
254
+ }
255
+ return 'Page heading';
256
+ }
257
+
258
+ /**
259
+ * @returns {string}
260
+ */
261
+ get title() {
262
+ return this._getTitle();
263
+ }
264
+
265
+ /**
266
+ * @param {string} value
267
+ */
268
+ set title(value) {
269
+ this._title = value;
270
+ this.render();
271
+ }
272
+ highlightTitle() {
273
+ this.setHighLighted(HighlightClass.TITLE);
274
+ }
275
+
276
+ /**
277
+ * @returns {{classes: string, text: string} | undefined}
278
+ */
279
+ get sectionTitle() {
280
+ if (this.sectionTitleText === undefined) {
281
+ return undefined;
282
+ }
283
+ return {
284
+ classes: this._isHighlighted(HighlightClass.REPEATER),
285
+ text: this.sectionTitleText
286
+ };
287
+ }
288
+
289
+ /**
290
+ * @returns {string|undefined}
291
+ * @protected
292
+ */
293
+ _getSectionTitleText() {
294
+ return this._sectionTitle;
295
+ }
296
+
297
+ /**
298
+ * @param {string | undefined} val
299
+ */
300
+ set sectionTitleText(val) {
301
+ this._sectionTitle = val ?? '';
302
+ this.render();
303
+ }
304
+ get sectionTitleText() {
305
+ return this._getSectionTitleText();
306
+ }
307
+
308
+ /**
309
+ * Creates a dummy component for when guidance is highlighted
310
+ * but no guidance text exists
311
+ * @returns {Markdown}
312
+ */
313
+ static createGuidanceComponent(highlight = true) {
314
+ const guidanceElement = new ContentElements({
315
+ type: ComponentType.Markdown,
316
+ title: 'Guidance component',
317
+ name: 'guidanceComponent',
318
+ content: 'Guidance text',
319
+ options: {}
320
+ });
321
+ const guidanceComponent = new Markdown(guidanceElement, questionRenderer);
322
+ if (highlight) {
323
+ guidanceComponent.highlightContent();
324
+ }
325
+ return guidanceComponent;
326
+ }
327
+ highlightGuidance() {
328
+ this._guidanceComponent.highlightContent();
329
+ this.setHighLighted(HighlightClass.GUIDANCE);
330
+ }
331
+
332
+ /**
333
+ * @param {HighlightClass} highlightSection
334
+ */
335
+ setHighLighted(highlightSection) {
336
+ this._highlighted = highlightSection;
337
+ this.render();
338
+ }
339
+ clearHighlight() {
340
+ this._highlighted = undefined;
341
+ this._guidanceComponent.unHighlightContent();
342
+ this.render();
343
+ }
344
+
345
+ /**
346
+ * @param {string} field
347
+ * @protected
348
+ * @returns {string}
349
+ */
350
+ _isHighlighted(field) {
351
+ return this._highlighted === field ? HIGHLIGHT_CLASS : '';
352
+ }
353
+ }
354
+
355
+ /**
356
+ * @import { PageRenderer, PageOverviewElements, PagePreviewBaseElements, QuestionRenderer, QuestionBaseModel } from '~/src/form/form-editor/preview/types.js'
357
+ * @import { Question } from '~/src/form/form-editor/preview/question.js'
358
+ * @import { PreviewComponent } from '~/src/form/form-editor/preview/preview.js'
359
+ * @import { FormDefinition, Page } from '~/src/form/form-definition/types.js'
360
+ * @import { ComponentDef, MarkdownComponent } from '~/src/components/types.js'
361
+ * @import { PagePreviewComponent, PagePreviewPanelMacro } from '~/src/form/form-editor/macros/types.js'
362
+ */
363
+ //# sourceMappingURL=page-controller-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-controller-base.js","names":["ComponentType","HIGHLIGHT_CLASS","ContentElements","Markdown","hasComponents","hasRepeater","questionRenderer","render","_questionTemplate","_questionBaseModel","HighlightClass","TITLE","GUIDANCE","REPEATER","PagePreviewElements","_page","title","constructor","page","undefined","heading","guidance","components","length","possibleGuidanceComponent","type","content","addHeading","repeatQuestion","repeat","options","PreviewPageControllerBase","PATH","_pageTemplate","_components","_showTitle","_title","pageRenderer","_highlighted","_guidanceText","_sectionTitle","_emptyGuidance","createGuidanceComponent","_guidanceComponent","_isRepeater","elements","renderer","_getGuidanceComponents","_guidanceComponents","componentsWithGuidance","map","component","model","renderInput","questionType","componentType","_getGuidanceText","guidanceText","text","classes","_isHighlighted","showTitle","pageTitle","setRepeater","unsetRepeater","isRepeater","_getTitle","value","highlightTitle","setHighLighted","sectionTitle","sectionTitleText","_getSectionTitleText","val","highlight","guidanceElement","name","guidanceComponent","highlightContent","highlightGuidance","highlightSection","clearHighlight","unHighlightContent","field"],"sources":["../../../../../../src/form/form-editor/preview/controller/page-controller-base.js"],"sourcesContent":["import { ComponentType } from '~/src/components/enums.js'\nimport { HIGHLIGHT_CLASS } from '~/src/form/form-editor/preview/constants.js'\nimport { ContentElements } from '~/src/form/form-editor/preview/content.js'\nimport { Markdown } from '~/src/form/form-editor/preview/markdown.js'\nimport { hasComponents, hasRepeater } from '~/src/pages/helpers.js'\n\n/**\n * @type {QuestionRenderer}\n */\nconst questionRenderer = {\n /**\n * @param {string} _questionTemplate\n * @param {QuestionBaseModel} _questionBaseModel\n */\n render(_questionTemplate, _questionBaseModel) {\n //\n }\n}\n/**\n * Enum for Highlight classes\n * @readonly\n * @enum {string}\n */\nconst HighlightClass = {\n TITLE: 'title',\n GUIDANCE: 'guidance',\n REPEATER: 'repeater'\n}\n\n/**\n * @implements {PageOverviewElements}\n */\nexport class PagePreviewElements {\n /**\n * @type {Page | { title: string }}\n * @private\n */\n _page = {\n title: ''\n }\n\n /**\n * @param {Page|undefined} page\n */\n constructor(page) {\n if (page !== undefined) {\n this._page = page\n }\n }\n\n get heading() {\n return this._page.title\n }\n\n get guidance() {\n if (!hasComponents(this._page) || !this._page.components.length) {\n return ''\n }\n\n const [possibleGuidanceComponent] = this._page.components\n\n return possibleGuidanceComponent.type === ComponentType.Markdown\n ? possibleGuidanceComponent.content\n : ''\n }\n\n get addHeading() {\n return this._page.title.length > 0\n }\n\n get repeatQuestion() {\n if (hasRepeater(this._page)) {\n return this._page.repeat.options.title\n }\n return undefined\n }\n\n get hasRepeater() {\n return hasRepeater(this._page)\n }\n}\n\n/**\n * @abstract\n * @implements {PagePreviewPanelMacro}\n */\nexport class PreviewPageControllerBase {\n static PATH = 'preview-controllers/'\n /**\n * @type {string}\n * @protected\n */\n _pageTemplate = PreviewPageControllerBase.PATH + 'page-controller.njk'\n /**\n * @protected\n * @type {Question[]}\n */\n _components = []\n /**\n * @type {boolean}\n * @protected\n */\n _showTitle = true\n /**\n * @protected\n * @type {string}\n */\n _title = ''\n /**\n *\n * @type {PageRenderer}\n */\n #pageRenderer\n /**\n * @type { undefined | HighlightClass }\n * @protected\n */\n _highlighted = undefined\n /**\n * @type {string}\n * @protected\n */\n _guidanceText = ''\n /**\n * @type { string }\n * @protected\n */\n _sectionTitle = ''\n /**\n * @type {Markdown}\n * @protected\n */\n _emptyGuidance = PreviewPageControllerBase.createGuidanceComponent()\n /**\n * @type {Markdown}\n * @protected\n */\n _guidanceComponent = PreviewPageControllerBase.createGuidanceComponent()\n /**\n * @protected\n * @type {boolean}\n */\n _isRepeater = false\n\n /**\n * @param {PagePreviewBaseElements} elements\n * @param {PageRenderer} renderer\n */\n constructor(elements, renderer) {\n this._guidanceText = elements.guidance\n this.#pageRenderer = renderer\n this._title = elements.heading\n }\n\n /**\n * @type {typeof HighlightClass}\n */\n static HighlightClass = HighlightClass\n\n /**\n * @returns {Markdown[]}\n * @protected\n */\n _getGuidanceComponents() {\n if (this._guidanceText.length) {\n return [this._guidanceComponent]\n }\n if (this._highlighted === 'guidance') {\n return [this._emptyGuidance]\n }\n return []\n }\n\n /**\n * @returns {Markdown[]}\n * @protected\n */\n get _guidanceComponents() {\n return this._getGuidanceComponents()\n }\n\n /**\n * @returns {PagePreviewComponent[]}\n */\n get components() {\n const componentsWithGuidance = /** @type {Question[]} */ ([\n ...this._guidanceComponents,\n ...this._components\n ])\n\n return componentsWithGuidance.map((component) => {\n return {\n model: component.renderInput,\n questionType: component.componentType\n }\n })\n }\n\n /**\n * @returns {string}\n * @protected\n */\n _getGuidanceText() {\n return this._guidanceText\n }\n\n set guidanceText(text) {\n this._guidanceText = text\n this._guidanceComponent.content = text\n this.render()\n }\n\n /**\n * @returns {string}\n */\n get guidanceText() {\n return this._getGuidanceText()\n }\n\n get guidance() {\n return {\n text: this.guidanceText,\n classes: this._isHighlighted(HighlightClass.GUIDANCE)\n }\n }\n\n /**\n * @param {boolean} showTitle\n */\n set showTitle(showTitle) {\n this._showTitle = showTitle\n this.render()\n }\n\n get showTitle() {\n return this._showTitle\n }\n\n /**\n * @returns {{ text: string, classes: string }}\n */\n get pageTitle() {\n return {\n text: this.title,\n classes: this._isHighlighted(HighlightClass.TITLE)\n }\n }\n\n setRepeater() {\n this._isRepeater = true\n this.render()\n }\n\n unsetRepeater() {\n this._isRepeater = false\n this.render()\n }\n\n get isRepeater() {\n return this._isRepeater\n }\n\n render() {\n this.#pageRenderer.render(this._pageTemplate, this)\n }\n\n /**\n * @returns {string}\n * @protected\n */\n _getTitle() {\n if (this._title.length) {\n return this._title\n }\n return 'Page heading'\n }\n\n /**\n * @returns {string}\n */\n get title() {\n return this._getTitle()\n }\n\n /**\n * @param {string} value\n */\n set title(value) {\n this._title = value\n this.render()\n }\n\n highlightTitle() {\n this.setHighLighted(HighlightClass.TITLE)\n }\n\n /**\n * @returns {{classes: string, text: string} | undefined}\n */\n get sectionTitle() {\n if (this.sectionTitleText === undefined) {\n return undefined\n }\n return {\n classes: this._isHighlighted(HighlightClass.REPEATER),\n text: this.sectionTitleText\n }\n }\n\n /**\n * @returns {string|undefined}\n * @protected\n */\n _getSectionTitleText() {\n return this._sectionTitle\n }\n\n /**\n * @param {string | undefined} val\n */\n set sectionTitleText(val) {\n this._sectionTitle = val ?? ''\n this.render()\n }\n\n get sectionTitleText() {\n return this._getSectionTitleText()\n }\n\n /**\n * Creates a dummy component for when guidance is highlighted\n * but no guidance text exists\n * @returns {Markdown}\n */\n static createGuidanceComponent(highlight = true) {\n const guidanceElement = new ContentElements({\n type: ComponentType.Markdown,\n title: 'Guidance component',\n name: 'guidanceComponent',\n content: 'Guidance text',\n options: {}\n })\n const guidanceComponent = new Markdown(guidanceElement, questionRenderer)\n\n if (highlight) {\n guidanceComponent.highlightContent()\n }\n return guidanceComponent\n }\n\n highlightGuidance() {\n this._guidanceComponent.highlightContent()\n this.setHighLighted(HighlightClass.GUIDANCE)\n }\n\n /**\n * @param {HighlightClass} highlightSection\n */\n setHighLighted(highlightSection) {\n this._highlighted = highlightSection\n this.render()\n }\n\n clearHighlight() {\n this._highlighted = undefined\n\n this._guidanceComponent.unHighlightContent()\n this.render()\n }\n\n /**\n * @param {string} field\n * @protected\n * @returns {string}\n */\n _isHighlighted(field) {\n return this._highlighted === field ? HIGHLIGHT_CLASS : ''\n }\n}\n\n/**\n * @import { PageRenderer, PageOverviewElements, PagePreviewBaseElements, QuestionRenderer, QuestionBaseModel } from '~/src/form/form-editor/preview/types.js'\n * @import { Question } from '~/src/form/form-editor/preview/question.js'\n * @import { PreviewComponent } from '~/src/form/form-editor/preview/preview.js'\n * @import { FormDefinition, Page } from '~/src/form/form-definition/types.js'\n * @import { ComponentDef, MarkdownComponent } from '~/src/components/types.js'\n * @import { PagePreviewComponent, PagePreviewPanelMacro } from '~/src/form/form-editor/macros/types.js'\n */\n"],"mappings":"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","ignoreList":[]}