{"version":3,"sources":["webpack:///./src/view/projects/Projects.view.vue?a85b","webpack:///./src/view/projects/component/ProjectItem.component.vue?5731","webpack:///./src/component/icon/FolderOpenIcon.component.vue?cde5","webpack:///./src/component/icon/FolderOpenIcon.component.vue?dc64","webpack:///./src/component/icon/FolderOpenIcon.component.vue","webpack:///./src/view/projects/component/ProjectItem.component.vue?3fa7","webpack:///./src/view/projects/component/ProjectItem.component.vue","webpack:///./src/view/projects/Projects.view.vue?73e1","webpack:///./src/view/projects/Projects.view.vue","webpack:///./src/view/projects/component/ProjectTag.component.vue?f232","webpack:///./src/view/projects/component/ProjectTag.component.vue?3993","webpack:///./src/view/projects/component/ProjectTag.component.vue","webpack:///./src/view/projects/Projects.view.vue?7dc7","webpack:///./src/api/client/projects/Project.client.ts","webpack:///./src/component/icon/ExternalLinkIcon.component.vue?8ed3","webpack:///./src/component/icon/ExternalLinkIcon.component.vue?9dc5","webpack:///./src/component/icon/ExternalLinkIcon.component.vue","webpack:///./src/view/projects/component/ProjectTag.component.vue?5a68","webpack:///./node_modules/core-js/modules/es.array.concat.js","webpack:///./src/view/projects/component/ProjectItem.component.vue?6b13","webpack:///./src/view/project/Project.view.vue?9545","webpack:///./src/view/project/Project.view.vue?0360","webpack:///./src/view/project/Project.view.vue"],"names":["_hoisted_1","key","_hoisted_2","_hoisted_3","class","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","_ctx","_cache","$props","$setup","$data","$options","_component_PageTitleComponent","_component_LoadingComponent","_component_UserMessageComponent","_component_AddIcon","_component_ButtonComponent","_component_router_link","_component_EditIcon","_component_PageActionsBarComponent","_component_ProjectItemComponent","_component_ArrowLeftIconComponent","_component_ArrowRightIconComponent","_component_ProjectTagComponent","_component_PageContentComponent","default","title","isLoading","message","details","userMessage","isVisible","isAdmin","right","to","_","projects","project","reference","maxPages","center","currentPage","routerPrevPage","routerNextPage","tagFrequencies","tagFrequency","index","tag","frequency","_hoisted_8","_hoisted_9","_component_FolderIcon","_component_ExternalLinkIcon","_component_LinkComponent","_component_GitHubIcon","previewImageUrl","width","height","src","displayDate","summary","tags","url","viewUrl","href","sourceCodeUrl","focusable","role","xmlns","viewBox","fill","colour","d","name","props","IconProps","setup","__exports__","components","ProjectTagComponent","ButtonComponent","ExternalLinkIcon","FolderIcon","GitHubIcon","LinkComponent","type","Object","required","startedAt","format","urlSlug","PageContentComponent","PageTitleComponent","PageActionsBarComponent","LoadingComponent","UserMessageComponent","ProjectItemComponent","ArrowLeftIconComponent","ArrowRightIconComponent","EditIcon","AddIcon","route","authDetails","getAuthDetails","value","user","Admin","none","Number","query","page","total","pageSize","MAX_VALUE","Math","ceil","String","max","min","loadProjects","searchProjects","response","Error","error","map","x","description","displayOrder","createdAt","ProjectClient","get","params","data","result","request","authorizationResult","post","headers","put","projectClient","$","global","fails","isArray","isObject","toObject","lengthOfArrayLike","createProperty","arraySpeciesCreate","arrayMethodHasSpeciesSupport","wellKnownSymbol","V8_VERSION","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","TypeError","IS_CONCAT_SPREADABLE_SUPPORT","array","concat","SPECIES_SUPPORT","isConcatSpreadable","O","spreadable","undefined","FORCED","target","proto","forced","arg","i","k","length","len","E","this","A","n","arguments","_component_LinkIcon","returnLink","returnText","fn","innerHTML","markdown","LinkIcon","parse","getProjectByUrlSlug"],"mappings":"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","file":"js/projects.4cbdeed7.js","sourcesContent":["import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx, createBlock as _createBlock, renderList as _renderList, Fragment as _Fragment, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { key: 0 }\nconst _hoisted_2 = { key: 1 }\nconst _hoisted_3 = { class: \"projects\" }\nconst _hoisted_4 = {\n key: 1,\n class: \"page-navigation\"\n}\nconst _hoisted_5 = { class: \"flex-auto text-center\" }\nconst _hoisted_6 = /*#__PURE__*/_createTextVNode()\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"h3\", null, \"Tags\", -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_PageTitleComponent = _resolveComponent(\"PageTitleComponent\")!\n const _component_LoadingComponent = _resolveComponent(\"LoadingComponent\")!\n const _component_UserMessageComponent = _resolveComponent(\"UserMessageComponent\")!\n const _component_AddIcon = _resolveComponent(\"AddIcon\")!\n const _component_ButtonComponent = _resolveComponent(\"ButtonComponent\")!\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_EditIcon = _resolveComponent(\"EditIcon\")!\n const _component_PageActionsBarComponent = _resolveComponent(\"PageActionsBarComponent\")!\n const _component_ProjectItemComponent = _resolveComponent(\"ProjectItemComponent\")!\n const _component_ArrowLeftIconComponent = _resolveComponent(\"ArrowLeftIconComponent\")!\n const _component_ArrowRightIconComponent = _resolveComponent(\"ArrowRightIconComponent\")!\n const _component_ProjectTagComponent = _resolveComponent(\"ProjectTagComponent\")!\n const _component_PageContentComponent = _resolveComponent(\"PageContentComponent\")!\n\n return (_openBlock(), _createBlock(_component_PageContentComponent, { class: \"projects-view\" }, {\n default: _withCtx(() => [\n _createVNode(_component_PageTitleComponent, { title: \"Projects\" }),\n (_ctx.isLoading)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_LoadingComponent, { message: \"Loading Projects\" })\n ]))\n : _createCommentVNode(\"\", true),\n _createVNode(_component_UserMessageComponent, { details: _ctx.userMessage }, null, 8, [\"details\"]),\n (!_ctx.isLoading && !_ctx.userMessage.isVisible)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n (_ctx.isAdmin)\n ? (_openBlock(), _createBlock(_component_PageActionsBarComponent, { key: 0 }, {\n right: _withCtx(() => [\n _createVNode(_component_router_link, { to: \"/project/edit\" }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_AddIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n }),\n _createVNode(_component_router_link, { to: \"/projects/settings\" }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_EditIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n })\n ]),\n _: 1\n }))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"section\", _hoisted_3, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.projects, (project) => {\n return (_openBlock(), _createBlock(_component_ProjectItemComponent, {\n key: project.reference,\n project: project\n }, null, 8, [\"project\"]))\n }), 128))\n ]),\n (_ctx.maxPages > 1)\n ? (_openBlock(), _createElementBlock(\"section\", _hoisted_4, [\n _createVNode(_component_PageActionsBarComponent, null, {\n center: _withCtx(() => [\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"flex-1 text-center\", { 'is-disabled': _ctx.currentPage === 1 }])\n }, [\n _createVNode(_component_router_link, { to: _ctx.routerPrevPage }, {\n default: _withCtx(() => [\n _createVNode(_component_ArrowLeftIconComponent)\n ]),\n _: 1\n }, 8, [\"to\"])\n ], 2),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"strong\", null, _toDisplayString(_ctx.currentPage), 1),\n _hoisted_6,\n _createElementVNode(\"small\", null, \"/ \" + _toDisplayString(_ctx.maxPages), 1)\n ]),\n _createElementVNode(\"div\", {\n class: _normalizeClass([\"flex-1 text-center\", { 'is-disabled': _ctx.currentPage === _ctx.maxPages }])\n }, [\n _createVNode(_component_router_link, { to: _ctx.routerNextPage }, {\n default: _withCtx(() => [\n _createVNode(_component_ArrowRightIconComponent)\n ]),\n _: 1\n }, 8, [\"to\"])\n ], 2)\n ]),\n _: 1\n })\n ]))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"section\", null, [\n _hoisted_7,\n _createElementVNode(\"p\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.tagFrequencies, (tagFrequency, index) => {\n return (_openBlock(), _createBlock(_component_ProjectTagComponent, {\n key: `tagFrequency-${index}`,\n tag: tagFrequency.tag,\n frequency: tagFrequency.frequency\n }, null, 8, [\"tag\", \"frequency\"]))\n }), 128))\n ])\n ])\n ]))\n : _createCommentVNode(\"\", true)\n ]),\n _: 1\n }))\n}","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"project-component flex gap flex-responsive\" }\nconst _hoisted_2 = { class: \"image-container flex-1 flex-vh-center text-center\" }\nconst _hoisted_3 = [\"src\"]\nconst _hoisted_4 = { class: \"content-container flex-2\" }\nconst _hoisted_5 = { class: \"flex gap-small\" }\nconst _hoisted_6 = { class: \"flex-1\" }\nconst _hoisted_7 = /*#__PURE__*/_createTextVNode(\"More Details\")\nconst _hoisted_8 = {\n key: 0,\n class: \"flex-auto\"\n}\nconst _hoisted_9 = {\n key: 1,\n class: \"flex-auto\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_FolderIcon = _resolveComponent(\"FolderIcon\")!\n const _component_ProjectTagComponent = _resolveComponent(\"ProjectTagComponent\")!\n const _component_ButtonComponent = _resolveComponent(\"ButtonComponent\")!\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_ExternalLinkIcon = _resolveComponent(\"ExternalLinkIcon\")!\n const _component_LinkComponent = _resolveComponent(\"LinkComponent\")!\n const _component_GitHubIcon = _resolveComponent(\"GitHubIcon\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n (_ctx.project.previewImageUrl === null)\n ? (_openBlock(), _createBlock(_component_FolderIcon, {\n key: 0,\n width: 48,\n height: 48\n }))\n : (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n src: _ctx.project.previewImageUrl\n }, null, 8, _hoisted_3))\n ]),\n _createElementVNode(\"div\", _hoisted_4, [\n _createElementVNode(\"h3\", null, _toDisplayString(_ctx.project.title), 1),\n _createElementVNode(\"small\", null, _toDisplayString(_ctx.displayDate), 1),\n _createElementVNode(\"p\", null, _toDisplayString(_ctx.project.summary), 1),\n _createElementVNode(\"p\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.project.tags, (tag, index) => {\n return (_openBlock(), _createBlock(_component_ProjectTagComponent, {\n key: `${_ctx.project.reference}-tag-${index}`,\n tag: tag\n }, null, 8, [\"tag\"]))\n }), 128))\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createVNode(_component_router_link, { to: _ctx.url }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _hoisted_7\n ]),\n _: 1\n })\n ]),\n _: 1\n }, 8, [\"to\"])\n ]),\n (_ctx.project.viewUrl !== null)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n _createVNode(_component_LinkComponent, {\n href: _ctx.project.viewUrl\n }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_ExternalLinkIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n }, 8, [\"href\"])\n ]))\n : _createCommentVNode(\"\", true),\n (_ctx.project.sourceCodeUrl !== null)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n _createVNode(_component_LinkComponent, {\n href: _ctx.project.sourceCodeUrl\n }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_GitHubIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n }, 8, [\"href\"])\n ]))\n : _createCommentVNode(\"\", true)\n ])\n ])\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"width\", \"height\"]\nconst _hoisted_2 = [\"fill\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n width: _ctx.width,\n height: _ctx.height,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n class: \"svg-icon icon-folder-open\",\n role: \"img\",\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 576 512\"\n }, [\n _createElementVNode(\"path\", {\n fill: _ctx.colour,\n d: \"M572.694 292.093L500.27 416.248A63.997 63.997 0 0 1 444.989 448H45.025c-18.523 0-30.064-20.093-20.731-36.093l72.424-124.155A64 64 0 0 1 152 256h399.964c18.523 0 30.064 20.093 20.73 36.093zM152 224h328v-48c0-26.51-21.49-48-48-48H272l-64-64H48C21.49 64 0 85.49 0 112v278.046l69.077-118.418C86.214 242.25 117.989 224 152 224z\"\n }, null, 8, _hoisted_2)\n ], 8, _hoisted_1))\n}","\nimport { defineComponent } from 'vue';\n\nimport { IconProps } from '@/component/type/IconProps';\n\nexport default defineComponent({\n name: 'FolderOpenIcon',\n\n props: IconProps,\n\n setup() {},\n});\n","import { render } from \"./FolderOpenIcon.component.vue?vue&type=template&id=6ab117f6&ts=true\"\nimport script from \"./FolderOpenIcon.component.vue?vue&type=script&lang=ts\"\nexport * from \"./FolderOpenIcon.component.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/home/wjbaker.com/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { computed, defineComponent, PropType } from 'vue';\n\nimport ProjectTagComponent from '@/view/projects/component/ProjectTag.component.vue';\nimport ButtonComponent from '@/component/Button.component.vue';\nimport LinkComponent from '@/component/Link.component.vue';\nimport ExternalLinkIcon from '@/component/icon/ExternalLinkIcon.component.vue';\nimport FolderIcon from '@/component/icon/FolderOpenIcon.component.vue';\nimport GitHubIcon from '@/component/icon/GitHubIcon.component.vue';\n\nimport { Project } from '@/model/Project.model';\n\nexport default defineComponent({\n name: 'ProjectItemComponent',\n\n components: {\n ProjectTagComponent,\n ButtonComponent,\n ExternalLinkIcon,\n FolderIcon,\n GitHubIcon,\n LinkComponent,\n },\n\n props: {\n project: {\n type: Object as PropType,\n required: true,\n },\n },\n\n setup(props) {\n const displayDate = computed(() => props.project.startedAt.format('MMMM YYYY'));\n const url = computed(() => `/project/${props.project.urlSlug}`);\n\n return {\n displayDate,\n url,\n }\n },\n});\n","import { render } from \"./ProjectItem.component.vue?vue&type=template&id=48b64194&ts=true\"\nimport script from \"./ProjectItem.component.vue?vue&type=script&lang=ts\"\nexport * from \"./ProjectItem.component.vue?vue&type=script&lang=ts\"\n\nimport \"./ProjectItem.component.vue?vue&type=style&index=0&id=48b64194&lang=scss\"\n\nimport exportComponent from \"/home/wjbaker.com/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\nimport { computed, defineComponent, onMounted, ref, watch } from 'vue';\nimport { RouteLocationNormalizedLoaded, useRoute } from 'vue-router';\nimport dayjs from 'dayjs';\n\nimport ProjectTagComponent from '@/view/projects/component/ProjectTag.component.vue';\nimport PageContentComponent from '@/component/layout/PageContent.component.vue';\nimport PageTitleComponent from '@/component/layout/PageTitle.component.vue';\nimport PageActionsBarComponent from '@/component/layout/PageActionsBar.component.vue';\nimport LoadingComponent from '@/component/Loading.component.vue';\nimport ButtonComponent from '@/component/Button.component.vue';\nimport UserMessageComponent, { UserMessage } from '@/component/UserMessage.component.vue';\nimport ProjectItemComponent from '@/view/projects/component/ProjectItem.component.vue';\nimport ArrowLeftIconComponent from '@/component/icon/ArrowLeftIcon.component.vue';\nimport ArrowRightIconComponent from '@/component/icon/ArrowRightIcon.component.vue';\nimport EditIcon from '@/component/icon/PencilIcon.component.vue';\nimport AddIcon from '@/component/icon/PlusIcon.component.vue';\n\nimport { projectClient } from '@/api/client/projects/Project.client';\nimport { userService } from '@/service/user/User.service';\n\nimport { Project } from '@/model/Project.model';\nimport { UserType } from '@/model/User.model';\n\ninterface TagFrequency {\n tag: string;\n frequency: number;\n}\n\nexport default defineComponent({\n name: 'ProjectsView',\n\n components: {\n PageContentComponent,\n PageTitleComponent,\n PageActionsBarComponent,\n LoadingComponent,\n ButtonComponent,\n UserMessageComponent,\n ProjectItemComponent,\n ProjectTagComponent,\n ArrowLeftIconComponent,\n ArrowRightIconComponent,\n EditIcon,\n AddIcon,\n },\n\n setup() {\n const route = useRoute();\n\n const authDetails = userService.getAuthDetails();\n const isAdmin = computed(() => authDetails.value?.user.type === UserType.Admin);\n\n const projects = ref>([]);\n const isLoading = ref(false);\n\n const userMessage = ref(UserMessage.none());\n\n const tagFrequencies = ref | null>(null);\n\n const currentPage = computed(() => Number(route.query.page ?? 1));\n const total = ref(null);\n const pageSize = ref(null);\n\n const maxPages = computed(() => {\n if (total.value === null || pageSize.value === null)\n return Number.MAX_VALUE;\n\n return Math.ceil(total.value / pageSize.value);\n });\n\n const routerPrevPage = computed(() => ({\n ...route,\n query: {\n ...route.query,\n page: String(Math.max(1, currentPage.value - 1)),\n },\n }));\n const routerNextPage = computed(() => ({\n ...route,\n query: {\n ...route.query,\n page: String(Math.min(maxPages.value, currentPage.value + 1)),\n },\n }));\n\n const loadProjects = async function () {\n isLoading.value = true;\n userMessage.value = UserMessage.none();\n\n const response = await projectClient.searchProjects(currentPage.value);\n if (response instanceof Error) {\n isLoading.value = false;\n userMessage.value = UserMessage.error(response.message || 'Unable to load projects; please try refreshing the page.');\n return;\n }\n\n projects.value = response.projects.map(x => ({\n reference: x.reference,\n title: x.title,\n urlSlug: x.urlSlug,\n startedAt: dayjs(x.startedAt),\n summary: x.summary,\n description: null,\n sourceCodeUrl: x.sourceCodeUrl,\n previewImageUrl: x.previewImageUrl,\n displayOrder: x.displayOrder,\n createdAt: dayjs(x.createdAt),\n viewUrl: x.viewUrl,\n tags: x.tags,\n }));\n\n tagFrequencies.value = response.tagFrequencies.map(x => ({\n tag: x.tag,\n frequency: x.frequency,\n }));\n\n total.value = response.total;\n pageSize.value = response.pageSize;\n\n isLoading.value = false;\n userMessage.value = UserMessage.none();\n };\n\n watch(currentPage, async () => {\n await loadProjects();\n });\n\n onMounted(async () => {\n await loadProjects();\n });\n\n return {\n isAdmin,\n projects,\n isLoading,\n userMessage,\n currentPage,\n total,\n pageSize,\n maxPages,\n routerPrevPage,\n routerNextPage,\n tagFrequencies,\n }\n },\n});\n","import { render } from \"./Projects.view.vue?vue&type=template&id=49816025&ts=true\"\nimport script from \"./Projects.view.vue?vue&type=script&lang=ts\"\nexport * from \"./Projects.view.vue?vue&type=script&lang=ts\"\n\nimport \"./Projects.view.vue?vue&type=style&index=0&id=49816025&lang=scss\"\n\nimport exportComponent from \"/home/wjbaker.com/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"project-tag-component\" }\nconst _hoisted_2 = { key: 0 }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"small\", _hoisted_1, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.tag), 1),\n (_ctx.frequency)\n ? (_openBlock(), _createElementBlock(\"strong\", _hoisted_2, \" (\" + _toDisplayString(_ctx.frequency) + \")\", 1))\n : _createCommentVNode(\"\", true)\n ]))\n}","\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'ProjectTagComponent',\n\n props: {\n tag: {\n type: String,\n required: true,\n },\n frequency: {\n type: Number,\n required: false,\n },\n },\n\n setup() {},\n});\n","import { render } from \"./ProjectTag.component.vue?vue&type=template&id=0ee01602&ts=true\"\nimport script from \"./ProjectTag.component.vue?vue&type=script&lang=ts\"\nexport * from \"./ProjectTag.component.vue?vue&type=script&lang=ts\"\n\nimport \"./ProjectTag.component.vue?vue&type=style&index=0&id=0ee01602&lang=scss\"\n\nimport exportComponent from \"/home/wjbaker.com/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./Projects.view.vue?vue&type=style&index=0&id=49816025&lang=scss\"","import { apiClient, asAdminUser, handleError } from '@/api/ApiClient';\n\nimport { ApiResultResponse } from '@/api/type/ApiResponse.type';\nimport { SearchProjectsResponse } from '@/api/client/projects/type/SearchProjects.type';\nimport { GetProjectByResponse } from '@/api/client/projects/type/GetProjectBy.type';\nimport { UpdateProjectRequest, UpdateProjectResponse } from '@/api/client/projects/type/UpdateProject.type';\nimport { CreateProjectRequest, CreateProjectResponse } from '@/api/client/projects/type/CreateProject.type';\n\nclass ProjectClient {\n\n public async searchProjects(page: number): Promise {\n try {\n const response = await apiClient.get>('/projects', {\n params: {\n page,\n },\n });\n\n return response.data.result;\n }\n catch (error) {\n return handleError(error);\n }\n }\n\n public async getProjectByUrlSlug(urlSlug: string): Promise {\n try {\n const response = await apiClient.get>(`/project/${urlSlug}`);\n\n return response.data.result;\n }\n catch (error) {\n return handleError(error);\n }\n }\n\n public async getProjectByReference(reference: string): Promise {\n try {\n const response = await apiClient.get>(`/project/${reference}`);\n\n return response.data.result;\n }\n catch (error) {\n return handleError(error);\n }\n }\n\n public async createProject(request: CreateProjectRequest): Promise {\n const authorizationResult = asAdminUser();\n if (authorizationResult instanceof Error)\n return authorizationResult;\n\n try {\n const response = await apiClient.post>('/project', request, {\n headers: {\n 'Authorization': authorizationResult,\n },\n });\n\n return response.data.result;\n }\n catch (error) {\n return handleError(error);\n }\n }\n\n public async updateProject(reference: string, request: UpdateProjectRequest): Promise {\n const authorizationResult = asAdminUser();\n if (authorizationResult instanceof Error)\n return authorizationResult;\n\n try {\n const response = await apiClient.put>(`/project/${reference}`, request, {\n headers: {\n 'Authorization': authorizationResult,\n },\n });\n\n return response.data.result;\n }\n catch (error) {\n return handleError(error);\n }\n }\n}\n\nexport const projectClient = new ProjectClient();","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"width\", \"height\"]\nconst _hoisted_2 = [\"fill\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n width: _ctx.width,\n height: _ctx.height,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n class: \"svg-icon icon-external-link\",\n role: \"img\",\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 512 512\"\n }, [\n _createElementVNode(\"path\", {\n fill: _ctx.colour,\n d: \"M432,320H400a16,16,0,0,0-16,16V448H64V128H208a16,16,0,0,0,16-16V80a16,16,0,0,0-16-16H48A48,48,0,0,0,0,112V464a48,48,0,0,0,48,48H400a48,48,0,0,0,48-48V336A16,16,0,0,0,432,320ZM488,0h-128c-21.37,0-32.05,25.91-17,41l35.73,35.73L135,320.37a24,24,0,0,0,0,34L157.67,377a24,24,0,0,0,34,0L435.28,133.32,471,169c15,15,41,4.5,41-17V24A24,24,0,0,0,488,0Z\"\n }, null, 8, _hoisted_2)\n ], 8, _hoisted_1))\n}","\nimport { defineComponent } from 'vue';\n\nimport { IconProps } from '@/component/type/IconProps';\n\nexport default defineComponent({\n name: 'ExternalLinkIcon',\n\n props: IconProps,\n\n setup() {},\n});\n","import { render } from \"./ExternalLinkIcon.component.vue?vue&type=template&id=43897900&ts=true\"\nimport script from \"./ExternalLinkIcon.component.vue?vue&type=script&lang=ts\"\nexport * from \"./ExternalLinkIcon.component.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/home/wjbaker.com/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./ProjectTag.component.vue?vue&type=style&index=0&id=0ee01602&lang=scss\"","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\nvar TypeError = global.TypeError;\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.es/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n concat: function concat(arg) {\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = lengthOfArrayLike(E);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./ProjectItem.component.vue?vue&type=style&index=0&id=48b64194&lang=scss\"","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createSlots as _createSlots, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { key: 0 }\nconst _hoisted_2 = [\"innerHTML\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_PageTitleComponent = _resolveComponent(\"PageTitleComponent\")!\n const _component_LinkIcon = _resolveComponent(\"LinkIcon\")!\n const _component_ButtonComponent = _resolveComponent(\"ButtonComponent\")!\n const _component_LinkComponent = _resolveComponent(\"LinkComponent\")!\n const _component_GitHubIcon = _resolveComponent(\"GitHubIcon\")!\n const _component_EditIcon = _resolveComponent(\"EditIcon\")!\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_PageActionsBarComponent = _resolveComponent(\"PageActionsBarComponent\")!\n const _component_LoadingComponent = _resolveComponent(\"LoadingComponent\")!\n const _component_UserMessageComponent = _resolveComponent(\"UserMessageComponent\")!\n const _component_PageContentComponent = _resolveComponent(\"PageContentComponent\")!\n\n return (_openBlock(), _createBlock(_component_PageContentComponent, { class: \"project-view\" }, {\n default: _withCtx(() => [\n _createVNode(_component_PageTitleComponent, {\n title: _ctx.project?.title ?? 'Loading Projects'\n }, null, 8, [\"title\"]),\n _createVNode(_component_PageActionsBarComponent, {\n returnLink: \"/projects\",\n returnText: \"Return to Projects\"\n }, _createSlots({ _: 2 }, [\n (_ctx.project !== null)\n ? {\n name: \"right\",\n fn: _withCtx(() => [\n (_ctx.project.viewUrl !== null)\n ? (_openBlock(), _createBlock(_component_LinkComponent, {\n key: 0,\n href: _ctx.project.viewUrl\n }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_LinkIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n }, 8, [\"href\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.project.sourceCodeUrl !== null)\n ? (_openBlock(), _createBlock(_component_LinkComponent, {\n key: 1,\n href: _ctx.project.sourceCodeUrl\n }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_GitHubIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n }, 8, [\"href\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.isAdmin)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 2,\n to: `/project/edit/${_ctx.project.reference}`\n }, {\n default: _withCtx(() => [\n _createVNode(_component_ButtonComponent, null, {\n default: _withCtx(() => [\n _createVNode(_component_EditIcon)\n ]),\n _: 1\n })\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ])\n }\n : undefined\n ]), 1024),\n (_ctx.isLoading)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_LoadingComponent, { message: \"Loading Project Details\" })\n ]))\n : _createCommentVNode(\"\", true),\n _createVNode(_component_UserMessageComponent, { details: _ctx.userMessage }, null, 8, [\"details\"]),\n (!_ctx.isLoading && !_ctx.userMessage.isVisible)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n innerHTML: _ctx.markdown\n }, null, 8, _hoisted_2))\n : _createCommentVNode(\"\", true)\n ]),\n _: 1\n }))\n}","\nimport { computed, defineComponent, onMounted, ref } from 'vue';\nimport { useRoute } from 'vue-router';\nimport dayjs from 'dayjs';\n\nimport PageContentComponent from '@/component/layout/PageContent.component.vue';\nimport PageTitleComponent from '@/component/layout/PageTitle.component.vue';\nimport PageActionsBarComponent from '@/component/layout/PageActionsBar.component.vue';\nimport ButtonComponent from '@/component/Button.component.vue';\nimport LinkComponent from '@/component/Link.component.vue';\nimport UserMessageComponent, { UserMessage } from '@/component/UserMessage.component.vue';\nimport LoadingComponent from '@/component/Loading.component.vue';\nimport LinkIcon from '@/component/icon/ExternalLinkIcon.component.vue';\nimport GitHubIcon from '@/component/icon/GitHubIcon.component.vue';\nimport EditIcon from '@/component/icon/PencilIcon.component.vue';\n\nimport { projectClient } from '@/api/client/projects/Project.client';\nimport { markdownService } from '@/service/markdown/Markdown.service';\nimport { userService } from '@/service/user/User.service';\n\nimport { Project } from '@/model/Project.model';\nimport { UserType } from '@/model/User.model';\n\nexport default defineComponent({\n name: 'ProjectView',\n\n components: {\n PageContentComponent,\n PageTitleComponent,\n PageActionsBarComponent,\n ButtonComponent,\n LinkComponent,\n UserMessageComponent,\n LoadingComponent,\n LinkIcon,\n GitHubIcon,\n EditIcon,\n },\n\n setup() {\n const route = useRoute();\n\n const project = ref(null);\n const isLoading = ref(false);\n\n const userMessage = ref(UserMessage.none());\n\n const markdown = computed(() => {\n if (project.value === null || project.value.description === null)\n return null;\n\n return markdownService.parse(project.value.description);\n });\n\n const authDetails = userService.getAuthDetails();\n const isAdmin = computed(() => authDetails.value?.user.type === UserType.Admin);\n\n onMounted(async () => {\n const urlSlug = route.params.urlSlug as string;\n\n isLoading.value = true;\n userMessage.value = UserMessage.none();\n\n const result = await projectClient.getProjectByUrlSlug(urlSlug);\n if (result instanceof Error) {\n isLoading.value = false;\n userMessage.value = UserMessage.error(result.message || 'Unable to load project, please try refreshing the page.');\n return;\n }\n\n project.value = {\n reference: result.reference,\n title: result.title,\n urlSlug: result.urlSlug,\n startedAt: dayjs(result.startedAt),\n summary: result.summary,\n description: result.description,\n sourceCodeUrl: result.sourceCodeUrl,\n previewImageUrl: result.previewImageUrl,\n displayOrder: result.displayOrder,\n createdAt: dayjs(result.createdAt),\n viewUrl: result.viewUrl,\n tags: result.tags,\n };\n\n isLoading.value = false;\n userMessage.value = UserMessage.none();\n });\n\n return {\n project,\n isLoading,\n userMessage,\n markdown,\n isAdmin,\n }\n },\n});\n","import { render } from \"./Project.view.vue?vue&type=template&id=2fb7d4f5&ts=true\"\nimport script from \"./Project.view.vue?vue&type=script&lang=ts\"\nexport * from \"./Project.view.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/home/wjbaker.com/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"sourceRoot":""}