This commit is contained in:
Martin Donnelly 2020-09-07 10:40:05 +01:00
parent 69a07f048d
commit 46965b17b8
18 changed files with 1280 additions and 136 deletions

View File

@ -0,0 +1,28 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<DBN-PSQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false" />
</DBN-PSQL>
<DBN-SQL>
<case-options enabled="true">
<option name="KEYWORD_CASE" value="lower" />
<option name="FUNCTION_CASE" value="lower" />
<option name="PARAMETER_CASE" value="lower" />
<option name="DATATYPE_CASE" value="lower" />
<option name="OBJECT_CASE" value="preserve" />
</case-options>
<formatting-settings enabled="false">
<option name="STATEMENT_SPACING" value="one_line" />
<option name="CLAUSE_CHOP_DOWN" value="chop_down_if_statement_long" />
<option name="ITERATION_ELEMENTS_WRAPPING" value="chop_down_if_not_single" />
</formatting-settings>
</DBN-SQL>
</code_scheme>
</component>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (2)" />
</state>
</component>

458
.idea/dbnavigator.xml Normal file
View File

@ -0,0 +1,458 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DataExportManager">
<export-instructions>
<create-header value="true" />
<quote-values-containing-separator value="true" />
<quote-all-values value="false" />
<value-separator value="" />
<file-name value="" />
<file-location value="" />
<scope value="GLOBAL" />
<destination value="FILE" />
<format value="EXCEL" />
<charset value="UTF-8" />
</export-instructions>
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.EditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.MethodExecutionManager">
<method-browser />
<execution-history>
<group-entries value="true" />
<execution-inputs />
</execution-history>
<argument-values-cache />
</component>
<component name="DBNavigator.Project.ObjectDependencyManager">
<last-used-dependency-type value="INCOMING" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component>
<component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
<recently-used-interfaces />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="NESTED TABLE" enabled="false" />
<object-type name="COLUMN" enabled="false" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE ATTRIBUTE" enabled="false" />
<object-type name="ARGUMENT" enabled="false" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<tracking-columns>
<columnNames value="" />
<visible value="true" />
<editable value="false" />
</tracking-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="CSS" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JavaScript" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="JSP" enabled="true" />
<content-type name="JSPx" enabled="true" />
<content-type name="ASP" enabled="true" />
<content-type name="YAML" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="JDBC" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
<component name="DBNavigator.Project.StatementExecutionManager">
<execution-variables />
</component>
</project>

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash
# rm -rf /home/martin/dev/menuserver/dist/*
cp -r /home/martin/dev/svelte-jobs/public/* /home/martin/dev/jobscraper/dist
cp -r /home/martin/dev/svelte-jobs/public/* /home/martin/dev/jobscraper/server/dist

42
package-lock.json generated
View File

@ -58,6 +58,14 @@
}
}
},
"@rollup/plugin-json": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.0.3.tgz",
"integrity": "sha512-QMUT0HZNf4CX17LMdwaslzlYHUKTYGuuk34yYIgZrNdu+pMEfqMS55gck7HEeHBKXHM4cz5Dg1OVwythDdbbuQ==",
"requires": {
"@rollup/pluginutils": "^3.0.8"
}
},
"@rollup/plugin-node-resolve": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz",
@ -75,7 +83,6 @@
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz",
"integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==",
"dev": true,
"requires": {
"@types/estree": "0.0.39",
"estree-walker": "^1.0.1",
@ -85,8 +92,7 @@
"estree-walker": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
"integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
"dev": true
"integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
}
}
},
@ -99,8 +105,7 @@
"@types/estree": {
"version": "0.0.39",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
"dev": true
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
},
"@types/node": {
"version": "14.0.1",
@ -791,6 +796,14 @@
"sha.js": "^2.4.8"
}
},
"cron": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz",
"integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==",
"requires": {
"moment-timezone": "^0.5.x"
}
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@ -2305,6 +2318,19 @@
"minimist": "^1.2.5"
}
},
"moment": {
"version": "2.25.3",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz",
"integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg=="
},
"moment-timezone": {
"version": "0.5.31",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
"integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
"requires": {
"moment": ">= 2.9.0"
}
},
"mri": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz",
@ -2313,8 +2339,7 @@
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"mute-stream": {
"version": "0.0.8",
@ -2688,8 +2713,7 @@
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
},
"pify": {
"version": "2.3.0",

View File

@ -21,7 +21,10 @@
"svelte-preprocess": "^3.7.1"
},
"dependencies": {
"@rollup/plugin-json": "^4.0.3",
"autoprefixer": "^9.7.6",
"cron": "^1.8.2",
"ms": "^2.1.2",
"node-sass": "^4.14.1",
"redaxios": "^0.2.0",
"rollup-plugin-replace": "^2.2.0",

25
public/gfx/star.svg Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 282.3 270.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="338.9" x2="322.8" y1="292.1" y2="203.1">
<stop offset="0" stop-color="#e6d82f"/>
<stop offset="1" stop-color="#faf26f"/>
</linearGradient>
<linearGradient id="b" gradientUnits="userSpaceOnUse" x1="391.9" x2="341.2" y1="310.6" y2="310.6">
<stop offset="0" stop-color="#d2c308"/>
<stop offset="1" stop-color="#e8da34"/>
</linearGradient>
</defs>
<g fill-rule="evenodd" transform="translate(-198.9 -145.7)">
<path d="m340.1 292.8l-.4-140.5-32.16 98.6z" fill="url(#a)"/>
<path d="m340.2 152.4l31.45 97.64-31.04 42.7z" fill="#d2c308"/>
<path d="m341.1 292.4l133.8-42.39-103.6-.01z" fill="#faf26f"/>
<path d="m341 293.1l50.85 17.34 83.1-60.32z" fill="#a29910"/>
<path d="m289.1 310.6l50.32-17.12-134.2-43.5z" fill="#d2c308"/>
<path d="m339.6 293.8l-82.67 116.1 32.22-99.1z" fill="#faf26f"/>
<path d="m341.1 293.6l50.78 16.82 31.72 97.69z" fill="url(#b)"/>
<path d="m340.2 348.6l83.08 59.65-82.56-114.4z" fill="#a29910"/>
<path d="m306.9 251.2l33.56 42.72-135.6-43.9z" fill="#faf26f"/>
<path d="m340.2 348.6l-82.9 59.3 83.03-114.5z" fill="#a29910"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -4,7 +4,7 @@
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>Svelte app</title>
<title>Jobs Server</title>
<link rel='icon' type='image/png' href='/favicon.png'>
<link rel='stylesheet' href='/global.css'>

View File

@ -7,6 +7,7 @@ import { terser } from 'rollup-plugin-terser';
import sveltePreprocess from 'svelte-preprocess';
import builtins from 'rollup-plugin-node-builtins';
import globals from 'rollup-plugin-node-globals';
import json from '@rollup/plugin-json';
const production = !process.env.ROLLUP_WATCH;
@ -30,6 +31,7 @@ export default {
'plugins': [
globals(),
builtins(),
json(),
svelte({
// enable run-time checks when not in production
'dev': !production,

View File

@ -2,6 +2,7 @@
import Menu from "./components/Menu.svelte";
import Lister from "./components/Lister.svelte";
import Detail from "./components/Detail.svelte";
import Header from "./components/Header.svelte";
</script>
<style lang="scss" global>
@ -15,20 +16,11 @@
</style>
<main>
<!--<Menu/>
<div class='dataPane splitContainerGrid'>
<Header/>
<div class="container fullWidth">
<div class="col-12">
<Lister/>
<Detail/>
</div>-->
<div class="grid view">
<div class="col-2">
<Menu/>
</div>
<div class="col-10">
<Lister/>
<Detail/>
</div>
</div>
</main>
</div>

View File

@ -4,18 +4,52 @@
let jobDetail = {};
let visible = false;
let applied = false;
let jobtype = 0;
$: {
if (!isEmpty($JobDetails)) {
applied = typeof ($JobDetails.data.applied) === "number" && $JobDetails.data.applied === 1;
jobtype = $JobDetails.data.jobtype;
}
}
JobDetails.subscribe((v) => {
visible = !isEmpty(v);
console.log(v);
})
function isEmpty(obj) {
for(const key in obj)
if(obj.hasOwnProperty(key)) return false;
for (const key in obj)
if (obj.hasOwnProperty(key)) return false;
return true;
}
function handleClick() {
actions.appliedJob($JobDetails._id);
}
function kill(w) {
console.log('>>kill',w);
}
function upvote() {
console.log('Upvote', $JobDetails._id);
actions.upVote($JobDetails._id);
}
function downvote() {
console.log('Downvote', $JobDetails._id);
actions.downVote($JobDetails._id);
}
</script>
<style>
@ -29,6 +63,7 @@
overflow-y: scroll;
}
.detailHead {
-webkit-box-sizing: border-box;
box-sizing: border-box;
@ -41,47 +76,91 @@
.row {
margin: 1% 0;
overflow: auto;
display:flex;
display: flex;
}
.applied {
-webkit-box-shadow: inset 0 0 5px 5px #f7de2f69;
box-shadow: inset 0 0 5px 5px #f7de2f69;
}
</style>
{#if visible}
<div class="detail">
<div class="detailHead bg-light">
<div class="row">
<div class="col-12 text-primary lead">
{$JobDetails.title}
<div class="detail">
<div class="detailHead bg-light {applied ? 'applied' : ''}">
<div class="row">
<div class="col-12 text-primary lead">
{$JobDetails.title}
</div>
{#if jobtype === 1}
<span class="badge badge-success">Contract</span>
{:else if jobtype === 2}
<span class="badge badge-danger">Permanent</span>
{/if}
</div>
<div class="row">
<div class="col-1-3rd">
Company: <span class="text-primary">{$JobDetails.company}</span>
</div>
<div class="col-1-3rd">
Location: <span class="text-primary">{$JobDetails.location}</span>
</div>
<div class="col-1-3rd">
Applied:
{#if !$JobDetails.a}
<button on:click={handleClick} class="btn btn-sm btn-primary">Applied</button>
{:else}
Applied!
{/if}
</div>
</div>
<div class="row">
<div class="col-1-3rd">
Salary: <span class="text-primary">{$JobDetails.salary}</span>
</div>
<div class="col-1-3rd">
Scraped: <span class="text-primary">{$JobDetails.date}</span>
</div>
<div class="col-1-3rd">
Site: <a href={$JobDetails.url} class="text-capitalize" target="_blank">{$JobDetails.site}</a>
</div>
</div>
<div class="row">
<div class="col-10">
{#each $JobDetails.data.autoclass.words as word, _wid}
{#if $JobDetails.data.autoclass.good.indexOf(word) !== -1}
<span class="badge badge-success">{word}</span>
{:else if $JobDetails.data.autoclass.bad.indexOf(word) !== -1}
<span class="badge badge-danger">{word}</span>
{:else }
<span class="badge badge-dark" on:click={kill(word)}>{word}</span>
{/if}
{/each}
</div>
<div class="col-1">
<button on:click={upvote} class="btn btn-sm btn-success">👍</button>
</div>
<div class="col-1">
<button on:click={downvote} class="btn btn-sm btn-danger">👎</button>
</div>
</div>
</div>
<div class="row">
<div class="col-6">
Company: <span class="text-primary">{$JobDetails.company}</span>
</div>
<div class="col-6">
Location: <span class="text-primary">{$JobDetails.location}</span>
</div>
</div>
<div class="row">
<div class="col-1-3rd">
Salary: <span class="text-primary">{$JobDetails.salary}</span>
</div>
<div class="col-1-3rd">
Scraped: <span class="text-primary">{$JobDetails.date}</span>
</div>
<div class="col-1-3rd">
Site: <a href={$JobDetails.url} class="text-capitalize" target="_blank">{$JobDetails.site}</a>
</div>
</div>
<blockquote>
{@html $JobDetails.summary}
</blockquote>
</div>
<blockquote>
{$JobDetails.summary}
</blockquote>
</div>
{/if}

View File

@ -0,0 +1,34 @@
<script>
import {actions} from '../state/state';
function handleClick() {
actions.markAllRead();
}
let titleText = 'Jobs';
let showFav = false;
</script>
<style>
</style>
<header class="navbar bg-primary">
<section class="navbar-section">
<span class="text-bold navbar-brand mx-1 text-uppercase">{titleText}</span>
</section>
<section class="navbar-section text-right">
<button on:click={handleClick} class="btn btn-sm btn-primary">Mark All Read</button>
<!-- <a href="/#/tweets" class="btn bg-primary ">Tweets</a>
<a href="/#/settings" class="btn bg-primary ">Settings</a>
{#if showFav}
<a href="/#/favourites" class="btn bg-primary">Favourites</a>
{/if}-->
</section>
</header>

View File

@ -2,9 +2,32 @@
import {JobList, actions} from '../state/state';
let prevRow;
const handleClick = id => {
actions.loadJobDetail(id);
};
function clickEvent(event) {
const parent = event.target.parentElement;
const id = parent.dataset.id;
actions.loadJobDetail(id);
actions.touchJob(id);
}
function ellipses(instr) {
return (instr.length <= 40) ? instr : `${instr.slice(0, 40)}…`
}
function haveRead(inval) {
return (inval.read !== 0) ? 'read' : '';
}
function haveApplied(inval) {
return (inval.applied !== 0) ? 'applied' : '';
}
</script>
<style>
@ -17,6 +40,42 @@
.hide {
display: none;
}
.company {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.dataRow {
font-weight: bold;
color: darkslategrey;
}
.read {
font-weight: normal !important;
color: dimgrey;
}
.applied {
-webkit-box-shadow: inset 0 0 5px 5px #f7de2f69;
box-shadow: inset 0 0 5px 5px #f7de2f69;
}
.dataRow:hover {
background-color: rgba(245, 238, 100, 0.54);
}
.small {
font-size: 70%;
}
.noOverflow {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
@ -40,10 +99,22 @@
</thead>
<tbody>
{#each $JobList as item, _id}
<tr on:click={handleClick(item._id)} class="dataRow">
<td>{item.title}</td>
<!--<tr on:click={handleClick(item._id)} class="dataRow">-->
<tr on:click|stopPropagation={clickEvent} class="dataRow {haveRead(item)} {haveApplied(item)}" data-id={item._id}>
<td class="noOverflow">
{item.title}
<!--<div>
{#each item.autoclass.words as word, _wid}
{#if item.autoclass.good.indexOf(word) !== -1}
<span class="badge badge-success">{word}</span>
{:else if item.autoclass.bad.indexOf(word) !== -1}
<span class="badge badge-danger">{word}</span>
{/if}
{/each}
</div>-->
</td>
<td>{item.site}</td>
<td>{item.company}</td>
<td>{ellipses(item.company)}</td>
<td>{item.date}</td>
</tr>
{/each}

View File

@ -1,23 +1,27 @@
<script>
import {actions} from '../state/state';
function handleClick(){
function handleClick() {
actions.markAllRead();
}
</script>
<style>
menu {
.menu {
border-right: 2px solid #e1e1e1;
background-color: #f4f4f4;
height:100vh;
height: 100vh;
}
</style>
<menu>
<div class="menu">
<h2>Jobs</h2>
<hr/>
<div class="text-center">
<button on:click={handleClick} class="btn btn-sm btn-primary">Mark All Read</button>
</div>
<button>Indeed</button>
</menu>
</div>

View File

@ -3,7 +3,6 @@
/* Global Styles */
:root {
--primary-color: #607D8B;
--dark-color: #294c5d;
@ -28,7 +27,7 @@ body {
line-height: 1.6;
background-color: #fff;
color: #333;
padding:0;
padding: 0;
}
a {
@ -40,7 +39,7 @@ a:hover {
color: #666;
}
a.active{
a.active {
color: var(--highlight-color);
}
@ -64,6 +63,11 @@ img {
padding: 0 2rem;
}
.fullWidth {
max-width: 100vw;
padding: 0 0;
}
/* Text Styles*/
.x-large {
font-size: 4rem;
@ -195,24 +199,31 @@ img {
.p {
padding: 0.5rem;
}
.p-1 {
padding: 1rem;
}
.p-2 {
padding: 2rem;
}
.p-3 {
padding: 3rem;
}
.py {
padding: 0.5rem 0;
}
.py-1 {
padding: 1rem 0;
}
.py-2 {
padding: 2rem 0;
}
.py-3 {
padding: 3rem 0;
}
@ -221,6 +232,7 @@ img {
.m {
margin: 0.5rem;
}
.m-1 {
margin: 1rem;
}
@ -274,15 +286,19 @@ img {
.m-3 {
margin: 3rem;
}
.my {
margin: 0.5rem 0;
}
.my-1 {
margin: 1rem 0;
}
.my-2 {
margin: 2rem 0;
}
.my-3 {
margin: 3rem 0;
}
@ -343,16 +359,19 @@ img {
padding-right: 15px;
}*/
.column,
.columns {
margin-left: 4%; }
.column:first-child,
.columns:first-child {
margin-left: 0; }
.column,
.columns {
margin-left: 4%;
}
.col-1 {
width: 8.33333%;
}
.column:first-child,
.columns:first-child {
margin-left: 0;
}
.col-1 {
width: 8.33333%;
}
.col-2 {
width: 16.66667%;
@ -469,7 +488,6 @@ img {
}
.btn {
display: inline-block;
background: var(--light-color);
@ -624,16 +642,19 @@ label,
legend {
display: block;
margin-bottom: .1rem;
font-weight: 600; }
font-weight: 600;
}
input[type="checkbox"],
input[type="radio"] {
display: inline; }
display: inline;
}
label > .label-body {
display: inline-block;
margin-left: .5rem;
font-weight: normal;
background-color: #dcc894;
background-color: #dcc894;
}
@ -649,7 +670,7 @@ table th {
/* Navbar */
.navbar {
position:fixed;
position: fixed;
display: flex;
justify-content: space-between;
align-items: center;
@ -757,7 +778,7 @@ table th {
.cardV2 {
border-radius: 4px;
background-color: #fff;
box-shadow: 0 0 4px 0 rgba(0,0,0,.14), 0 3px 4px 0 rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2);
box-shadow: 0 0 4px 0 rgba(0, 0, 0, .14), 0 3px 4px 0 rgba(0, 0, 0, .12), 0 1px 5px 0 rgba(0, 0, 0, .2);
/*display: flex;
flex-direction: column;*/
min-width: 0;
@ -777,8 +798,8 @@ tr {
border-top: 1px solid #ccc;
}
tbody tr:nth-of-type(odd){
background-color: rgba(0,0,0,0.04);
tbody tr:nth-of-type(odd) {
background-color: rgba(0, 0, 0, 0.04);
}
tbody td {
@ -789,8 +810,8 @@ hr {
margin-top: 2.2rem;
margin-bottom: 2rem;
border-width: 0;
border-top: 1px solid var(--dark-color); }
border-top: 1px solid var(--dark-color);
}
.modalWindow {
@ -799,16 +820,18 @@ hr {
right: 0;
bottom: 0;
left: 0;
background: rgba(0,0,0,0.2);
background: rgba(0, 0, 0, 0.2);
z-index: 99999;
opacity:0;
opacity: 0;
pointer-events: none;
text-align:center;
text-align: center;
}
.modalWindow:target {
opacity:1;
opacity: 1;
pointer-events: auto;
}
.modalWindow > div {
width: 500px;
position: relative;
@ -818,8 +841,9 @@ hr {
header + div.container {
position: relative;
top:var(--navbar-height);
top: var(--navbar-height);
min-height: calc(100vh - var(--navbar-height));
max-height: calc(100vh - var(--navbar-height));
}
@ -920,42 +944,149 @@ header + div.container {
// Mouse pointers
.alias {cursor: alias;}
.all-scroll {cursor: all-scroll;}
.auto {cursor: auto;}
.cell {cursor: cell;}
.context-menu {cursor: context-menu;}
.col-resize {cursor: col-resize;}
.copy {cursor: copy;}
.crosshair {cursor: crosshair;}
.default {cursor: default;}
.e-resize {cursor: e-resize;}
.ew-resize {cursor: ew-resize;}
.grab {cursor: grab;}
.grabbing {cursor: grabbing;}
.help {cursor: help;}
.move {cursor: move;}
.n-resize {cursor: n-resize;}
.ne-resize {cursor: ne-resize;}
.nesw-resize {cursor: nesw-resize;}
.ns-resize {cursor: ns-resize;}
.nw-resize {cursor: nw-resize;}
.nwse-resize {cursor: nwse-resize;}
.no-drop {cursor: no-drop;}
.none {cursor: none;}
.not-allowed {cursor: not-allowed;}
.pointer {cursor: pointer;}
.progress {cursor: progress;}
.row-resize {cursor: row-resize;}
.s-resize {cursor: s-resize;}
.se-resize {cursor: se-resize;}
.sw-resize {cursor: sw-resize;}
.text {cursor: text;}
.url {cursor: url(myBall.cur),auto;}
.w-resize {cursor: w-resize;}
.wait {cursor: wait;}
.zoom-in {cursor: zoom-in;}
.zoom-out {cursor: zoom-out;}
.alias {
cursor: alias;
}
.all-scroll {
cursor: all-scroll;
}
.auto {
cursor: auto;
}
.cell {
cursor: cell;
}
.context-menu {
cursor: context-menu;
}
.col-resize {
cursor: col-resize;
}
.copy {
cursor: copy;
}
.crosshair {
cursor: crosshair;
}
.default {
cursor: default;
}
.e-resize {
cursor: e-resize;
}
.ew-resize {
cursor: ew-resize;
}
.grab {
cursor: grab;
}
.grabbing {
cursor: grabbing;
}
.help {
cursor: help;
}
.move {
cursor: move;
}
.n-resize {
cursor: n-resize;
}
.ne-resize {
cursor: ne-resize;
}
.nesw-resize {
cursor: nesw-resize;
}
.ns-resize {
cursor: ns-resize;
}
.nw-resize {
cursor: nw-resize;
}
.nwse-resize {
cursor: nwse-resize;
}
.no-drop {
cursor: no-drop;
}
.none {
cursor: none;
}
.not-allowed {
cursor: not-allowed;
}
.pointer {
cursor: pointer;
}
.progress {
cursor: progress;
}
.row-resize {
cursor: row-resize;
}
.s-resize {
cursor: s-resize;
}
.se-resize {
cursor: se-resize;
}
.sw-resize {
cursor: sw-resize;
}
.text {
cursor: text;
}
.url {
cursor: url(myBall.cur), auto;
}
.w-resize {
cursor: w-resize;
}
.wait {
cursor: wait;
}
.zoom-in {
cursor: zoom-in;
}
.zoom-out {
cursor: zoom-out;
}
/*
@ -966,3 +1097,116 @@ header + div.container {
display: table;
clear: both; }
*/
.hour27 {
border-left: 10px solid rgb(80, 181, 221)
}
.hour26 {
border-left: 10px solid rgb(78, 178, 206)
}
.hour25 {
border-left: 10px solid rgb(76, 176, 190)
}
.hour24 {
border-left: 10px solid rgb(73, 173, 175)
}
.hour23 {
border-left: 10px solid rgb(72, 171, 159)
}
.hour22 {
border-left: 10px solid rgb(70, 168, 142)
}
.hour21 {
border-left: 10px solid rgb(68, 166, 125)
}
.hour20 {
border-left: 10px solid rgb(66, 164, 108)
}
.hour19 {
border-left: 10px solid rgb(102, 173, 94)
}
.hour18 {
border-left: 10px solid rgb(135, 190, 64)
}
.hour17 {
border-left: 10px solid rgb(179, 204, 26)
}
.hour16 {
border-left: 10px solid rgb(214, 213, 28)
}
.hour15 {
border-left: 10px solid rgb(249, 202, 3)
}
.hour14 {
border-left: 10px solid rgb(246, 181, 3)
}
.hour13 {
border-left: 10px solid rgb(244, 150, 26)
}
.hour12 {
border-left: 10px solid rgb(236, 110, 5)
}
.hour11 {
border-left: 10px solid #ea5a24;
}
.hour10 {
border-left: 10px solid #e4572b;
}
.hour09 {
border-left: 10px solid #e14a29;
}
.hour08 {
border-left: 10px solid #e04127;
}
.hour07 {
border-left: 10px solid #d9372b;
}
.hour06 {
border-left: 10px solid #d63129;
}
.hour05 {
border-left: 10px solid #d12b2b;
}
.hour04 {
border-left: 10px solid #cd282f;
}
.hour03 {
border-left: 10px solid #c82432;
}
.hour02 {
border-left: 10px solid #c32334;
}
.hour01 {
border-left: 10px solid #be2138;
}
.hour00 {
border-left: 10px solid #b9203b;
}

View File

@ -1,11 +1,32 @@
import App from './App.svelte';
import ms from 'ms';
import { actions } from './state/state';
let timerID = 0;
const app = new App({
'target': document.body
});
actions.getJobList();
function toHour(extra = 0) {
const now = new Date();
return (3600000 - (now.getTime() % 3600000)) + extra;
}
function update() {
actions.getJobList();
const delay = toHour() + ms('10m');
console.log('Next:', delay);
timerID = setTimeout(() => {
update();
}, delay);
}
update();
export default app;

34
src/oldapp.txt Normal file
View File

@ -0,0 +1,34 @@
<script>
import Menu from "./components/Menu.svelte";
import Lister from "./components/Lister.svelte";
import Detail from "./components/Detail.svelte";
</script>
<style lang="scss" global>
@import "./css/global.scss";
.view {
height:100vh;
}
</style>
<main>
<!--<Menu/>
<div class='dataPane splitContainerGrid'>
<Lister/>
<Detail/>
</div>-->
<div class="grid view">
<div class="col-2">
<Menu/>
</div>
<div class="col-10">
<Lister/>
<Detail/>
</div>
</div>
</main>

View File

@ -9,10 +9,15 @@ import { writable, get } from 'svelte/store';
import axios from 'redaxios';
// const baseUrl = (__ENV__ === 'production') ? (`${location.protocol }//${ location.hostname}`) : 'http://localhost:3000';
const baseUrl = 'http://localhost:3000';
const baseUrl = (__ENV__ === 'production') ? (`${location.protocol }//${ location.hostname}`) : 'http://localhost:3000';
// const baseUrl = 'http://localhost:3000';
const urls = {
'jobs': baseUrl.concat('/jobs')
'jobs': baseUrl.concat('/jobs'),
'apply': baseUrl.concat('/apply'),
'readall' : baseUrl.concat('/readall'),
'kill' : baseUrl.concat('/kill'),
'upvote' : baseUrl.concat('/vote/up'),
'downvote' : baseUrl.concat('/vote/down')
};
const JobList = writable([]);
@ -42,8 +47,123 @@ const actions = {
console.error('loadJobDetail', err);
});
}
},
async touchJob(id) {
console.log(`touchJob: ${id}`);
if (id) {
const u = `${urls.jobs}/${id}`;
await axios.put(u).then((d) => {
if (d.status !== 200)
console.error(d);
}).catch((err) => {
console.error('touchJob', err);
});
JobList.update((data) => {
data.map((v) => {
if (v._id === id) {
v.read = new Date().getTime();
return v;
}
});
return data;
});
}
},
async appliedJob(id) {
console.log(`touchJob: ${id}`);
const now = new Date().getTime();
// JobDetails
if (id) {
console.log('Applying..');
const u = `${urls.apply}/${id}`;
await axios.put(u).then((d) => {
if (d.status !== 200)
console.error(d);
}).catch((err) => {
console.error('appliedJob', err);
});
const _id = parseInt(id, 10);
JobList.update((data) => {
data.map((v) => {
if (v._id === _id) {
v.a = now;
return v;
}
});
return data;
});
JobDetails.update((v) => {
v.a = now;
return v;
});
}
},
async markAllRead() {
console.log('>> markAllRead');
const u = `${urls.readall}`;
await axios.put(u).then((d) => {
if (d.status !== 200)
console.error(d);
}).catch((err) => {
console.error('markAllRead', err);
});
this.getJobList();
},
killWord(word) {
console.log(`>> killword:${word}`);
const u = `${urls.kill}/${word}`;
axios.put(u).then((d) => {
if (d.status !== 200)
console.error(d);
}).catch((err) => {
console.error('killword', err);
});
},
upVote(id) {
console.log(`>> upvote:${id}`);
const u = `${urls.upvote}/${id}`;
axios.put(u).then((d) => {
if (d.status !== 200)
console.error(d);
}).catch((err) => {
console.error('upvote', err);
});
},
downVote(id) {
console.log(`>> downvote:${id}`);
const u = `${urls.downvote}/${id}`;
axios.put(u).then((d) => {
if (d.status !== 200)
console.error(d);
}).catch((err) => {
console.error('downvote', err);
});
}
};
export { JobList, JobDetails, actions };