forked from MapComplete/MapComplete
		
	Merge branch 'master' into develop
This commit is contained in:
		
						commit
						5ff52b5c1d
					
				
					 21 changed files with 415 additions and 146 deletions
				
			
		|  | @ -220,8 +220,8 @@ | |||
|         <td/> | ||||
|         {/if} | ||||
|       {#each range(7) as wd} | ||||
|         <OHCell type="half" {h} {wd} on:start={() => startSelection(wd, h)} on:end={() => endSelection(wd, h)} | ||||
|                 on:move={() => moved(wd, h)} on:clear={() => clearSelection()} /> | ||||
|         <OHCell type="half" {h} {wd} on:start={() => startSelection(wd, h + 0.5)} on:end={() => endSelection(wd, h + 0.5)} | ||||
|                 on:move={() => moved(wd, h + 0.5)} on:clear={() => clearSelection()} /> | ||||
|       {/each} | ||||
|     </tr> | ||||
| 
 | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
|     .getSchemaStartingWith(schema.path) | ||||
|     .filter((part) => part.path.length - 1 === schema.path.length) | ||||
| 
 | ||||
|   let usesOverride = value["builtin"] !== undefined | ||||
|   let usesOverride = value?.["builtin"] !== undefined | ||||
| 
 | ||||
|   function schemaForMultitype() { | ||||
|     const sch = { ...schema } | ||||
|  | @ -138,7 +138,7 @@ | |||
|       </div> | ||||
|     {:else if typeof value === "string"} | ||||
|       Builtin: <b>{value}</b> | ||||
|     {:else if value["builtin"]} | ||||
|     {:else if value?.["builtin"]} | ||||
|       reused tagrendering <span class="font-bold">{JSON.stringify(value["builtin"])}</span> | ||||
|     {:else} | ||||
|       <Tr cls="font-bold" t={Translations.T(value?.question ?? value?.render)} /> | ||||
|  |  | |||
|  | @ -159,6 +159,9 @@ export abstract class EditJsonState<T> { | |||
|     } | ||||
| 
 | ||||
|     public getSchemaStartingWith(path: string[]) { | ||||
|         if(path === undefined){ | ||||
|             return undefined | ||||
|         } | ||||
|         return this.schema.filter( | ||||
|             (sch) => | ||||
|                 !path.some((part, i) => !(sch.path.length > path.length && sch.path[i] === part)) | ||||
|  |  | |||
|  | @ -5,18 +5,23 @@ | |||
|   import { TrashIcon } from "@babeard/svelte-heroicons/mini" | ||||
|   import ShowConversionMessage from "./ShowConversionMessage.svelte" | ||||
|   import Markdown from "../Base/Markdown.svelte" | ||||
|   import type { QuestionableTagRenderingConfigJson } from "../../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" | ||||
|   import type { | ||||
|     QuestionableTagRenderingConfigJson | ||||
|   } from "../../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson" | ||||
|   import CollapsedTagRenderingPreview from "./CollapsedTagRenderingPreview.svelte" | ||||
|   import { Accordion } from "flowbite-svelte" | ||||
|   import { Utils } from "../../Utils" | ||||
| 
 | ||||
|   export let state: EditJsonState<any> | ||||
|   export let path: (string | number)[] = [] | ||||
|   let schema: ConfigMeta = state.getSchema(path)[0] | ||||
|   console.log("SBA got schema", schema, "for path", path) | ||||
| 
 | ||||
|   let title = schema.path.at(-1) | ||||
| 
 | ||||
|   let title = schema?.path?.at(-1) | ||||
|   let singular = title | ||||
|   if (title?.endsWith("s")) { | ||||
|     singular = title.slice(0, title.length - 1) | ||||
|     singular = title?.slice(0, title.length - 1) | ||||
|   } | ||||
|   let article = "a" | ||||
|   if (singular?.match(/^[aeoui]/)) { | ||||
|  | @ -25,18 +30,20 @@ | |||
| 
 | ||||
|   const isTagRenderingBlock = path.length === 1 && path[0] === "tagRenderings" | ||||
| 
 | ||||
|   if (isTagRenderingBlock) { | ||||
|   if (isTagRenderingBlock && schema !== undefined) { | ||||
|     schema = { ...schema } | ||||
|     schema.description = undefined | ||||
|   } | ||||
| 
 | ||||
|   const subparts: ConfigMeta[] = state | ||||
|     .getSchemaStartingWith(schema.path) | ||||
|     .filter((part) => part.path.length - 1 === schema.path.length) | ||||
|     .getSchemaStartingWith(schema?.path) | ||||
|     ?.filter((part) => part.path.length - 1 === schema?.path?.length) | ||||
|   let messages = state.messagesFor(path) | ||||
| 
 | ||||
|   let datapath = path | ||||
|   const currentValue = state.getStoreFor<(string | QuestionableTagRenderingConfigJson)[]>(datapath) | ||||
|   currentValue.set(Utils.DedupT(currentValue.data)) | ||||
|   console.log("Current value is", currentValue.data) | ||||
|   if (currentValue.data === undefined) { | ||||
|     currentValue.setData([]) | ||||
|   } | ||||
|  | @ -62,68 +69,69 @@ | |||
|     currentValue.ping() | ||||
|   } | ||||
| </script> | ||||
| {#if schema !== undefined} | ||||
|   <div class="pl-2"> | ||||
|     <h3>{schema.path.at(-1)}</h3> | ||||
| 
 | ||||
| <div class="pl-2"> | ||||
|   <h3>{schema.path.at(-1)}</h3> | ||||
| 
 | ||||
|   {#if subparts.length > 0} | ||||
|     <Markdown src={schema.description} /> | ||||
|   {/if} | ||||
|   {#if $currentValue === undefined} | ||||
|     No array defined | ||||
|   {:else if !Array.isArray($currentValue)} | ||||
|     Not an array: {typeof $currentValue} | ||||
|     {JSON.stringify(path)} | ||||
|     {JSON.stringify($currentValue).slice(0, 120)} | ||||
|   {:else if $currentValue?.length === 0} | ||||
|     No values are defined | ||||
|     {#if $messages.length > 0} | ||||
|       {#each $messages as message} | ||||
|         <ShowConversionMessage {message} /> | ||||
|       {/each} | ||||
|     {#if subparts.length > 0} | ||||
|       <Markdown src={schema.description} /> | ||||
|     {/if} | ||||
|   {:else if subparts.length === 0} | ||||
|     <!-- We need an array of values, so we use the typehint of the _parent_ element as field --> | ||||
|     {#each $currentValue as value, i} | ||||
|       <div class="flex w-full"> | ||||
|         <SchemaBasedField {state} {schema} path={fusePath(i)} /> | ||||
|         <button | ||||
|           class="h-fit w-fit rounded-full border border-black p-1" | ||||
|           on:click={() => { | ||||
|     {#if $currentValue === undefined} | ||||
|       No array defined | ||||
|     {:else if !Array.isArray($currentValue)} | ||||
|       Not an array: {typeof $currentValue} | ||||
|       {JSON.stringify(path)} | ||||
|       {JSON.stringify($currentValue).slice(0, 120)} | ||||
|     {:else if $currentValue?.length === 0} | ||||
|       No values are defined | ||||
|       {#if $messages.length > 0} | ||||
|         {#each $messages as message} | ||||
|           <ShowConversionMessage {message} /> | ||||
|         {/each} | ||||
|       {/if} | ||||
|     {:else if subparts.length === 0} | ||||
|       <!-- We need an array of values, so we use the typehint of the _parent_ element as field --> | ||||
|       {#each $currentValue as value, i} | ||||
|         <div class="flex w-full"> | ||||
|           <SchemaBasedField {state} {schema} path={fusePath(i)} /> | ||||
|           <button | ||||
|             class="h-fit w-fit rounded-full border border-black p-1" | ||||
|             on:click={() => { | ||||
|             del(i) | ||||
|           }} | ||||
|         > | ||||
|           <TrashIcon class="h-4 w-4" /> | ||||
|         </button> | ||||
|       </div> | ||||
|     {/each} | ||||
|   {:else} | ||||
|     <Accordion> | ||||
|       {#each $currentValue as value, i (value)} | ||||
|         <CollapsedTagRenderingPreview | ||||
|           {state} | ||||
|           {isTagRenderingBlock} | ||||
|           {schema} | ||||
|           {currentValue} | ||||
|           {value} | ||||
|           {i} | ||||
|           {singular} | ||||
|           path={fusePath(i)} | ||||
|         /> | ||||
|           > | ||||
|             <TrashIcon class="h-4 w-4" /> | ||||
|           </button> | ||||
|         </div> | ||||
|       {/each} | ||||
|     </Accordion> | ||||
|   {/if} | ||||
|   <div class="flex"> | ||||
|     <button on:click={() => createItem()}>Add {article} {singular}</button> | ||||
|     {#if path.length === 1 && path[0] === "tagRenderings"} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|     {:else} | ||||
|       <Accordion> | ||||
|         {#each $currentValue as value, i} | ||||
|           <CollapsedTagRenderingPreview | ||||
|             {state} | ||||
|             {isTagRenderingBlock} | ||||
|             {schema} | ||||
|             {currentValue} | ||||
|             {value} | ||||
|             {i} | ||||
|             {singular} | ||||
|             path={fusePath(i)} | ||||
|           /> | ||||
|         {/each} | ||||
|       </Accordion> | ||||
|     {/if} | ||||
|     <div class="flex"> | ||||
|       <button on:click={() => createItem()}>Add {article} {singular}</button> | ||||
|       {#if path.length === 1 && path[0] === "tagRenderings"} | ||||
|         <button | ||||
|           on:click={() => { | ||||
|           createItem("images") | ||||
|         }} | ||||
|       > | ||||
|         Add a builtin tagRendering | ||||
|       </button> | ||||
|     {/if} | ||||
|     <slot name="extra-button" /> | ||||
|         > | ||||
|           Add a builtin tagRendering | ||||
|         </button> | ||||
|       {/if} | ||||
|       <slot name="extra-button" /> | ||||
|     </div> | ||||
|   </div> | ||||
| </div> | ||||
| {/if} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue