diff --git a/src/JobsJobsJobs/App/package-lock.json b/src/JobsJobsJobs/App/package-lock.json
index 64e8654..4bdc4bd 100644
--- a/src/JobsJobsJobs/App/package-lock.json
+++ b/src/JobsJobsJobs/App/package-lock.json
@@ -11,6 +11,7 @@
"@mdi/js": "^5.9.55",
"@vuelidate/core": "^2.0.0-alpha.24",
"@vuelidate/validators": "^2.0.0-alpha.21",
+ "@vueuse/core": "^6.3.3",
"bootstrap": "^5.1.0",
"core-js": "^3.16.3",
"date-fns": "^2.23.0",
@@ -3765,6 +3766,53 @@
"vue-demi": "^0.11.3"
}
},
+ "node_modules/@vueuse/core": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-6.3.3.tgz",
+ "integrity": "sha512-qa/0WYqcvqFKQmlkgsLGlXBrYcQeUi3fzHMIaxsD/lO/zm0IWBSN8CTFu91LwER5qNYs4DGhU5pu7jOdrTzAIQ==",
+ "dependencies": {
+ "@vueuse/shared": "6.3.3",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.1.0",
+ "vue": "^2.6.0 || ^3.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/core/node_modules/@vueuse/shared": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-6.3.3.tgz",
+ "integrity": "sha512-2+YPRhFNUXEhhvKNTWBtNU6hGkft9+mfYSVjI4hZu2U8KDbNNKF/215lBPzMYI2twScDtPsAssQ+vu5t9PBy0g==",
+ "dependencies": {
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.1.0",
+ "vue": "^2.6.0 || ^3.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@webassemblyjs/ast": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
@@ -21238,6 +21286,25 @@
"vue-demi": "^0.11.3"
}
},
+ "@vueuse/core": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-6.3.3.tgz",
+ "integrity": "sha512-qa/0WYqcvqFKQmlkgsLGlXBrYcQeUi3fzHMIaxsD/lO/zm0IWBSN8CTFu91LwER5qNYs4DGhU5pu7jOdrTzAIQ==",
+ "requires": {
+ "@vueuse/shared": "6.3.3",
+ "vue-demi": "*"
+ },
+ "dependencies": {
+ "@vueuse/shared": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-6.3.3.tgz",
+ "integrity": "sha512-2+YPRhFNUXEhhvKNTWBtNU6hGkft9+mfYSVjI4hZu2U8KDbNNKF/215lBPzMYI2twScDtPsAssQ+vu5t9PBy0g==",
+ "requires": {
+ "vue-demi": "*"
+ }
+ }
+ }
+ },
"@webassemblyjs/ast": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
diff --git a/src/JobsJobsJobs/App/package.json b/src/JobsJobsJobs/App/package.json
index 45eba23..549b379 100644
--- a/src/JobsJobsJobs/App/package.json
+++ b/src/JobsJobsJobs/App/package.json
@@ -13,6 +13,7 @@
"@mdi/js": "^5.9.55",
"@vuelidate/core": "^2.0.0-alpha.24",
"@vuelidate/validators": "^2.0.0-alpha.21",
+ "@vueuse/core": "^6.3.3",
"bootstrap": "^5.1.0",
"core-js": "^3.16.3",
"date-fns": "^2.23.0",
diff --git a/src/JobsJobsJobs/App/src/components/ListingSearchForm.vue b/src/JobsJobsJobs/App/src/components/ListingSearchForm.vue
index 287e876..3a240ad 100644
--- a/src/JobsJobsJobs/App/src/components/ListingSearchForm.vue
+++ b/src/JobsJobsJobs/App/src/components/ListingSearchForm.vue
@@ -1,15 +1,15 @@
form.container
.row
- .col.col-xs-12.col-sm-6.col-md-4.col-lg-3
+ .col-xs-12.col-sm-6.col-md-4.col-lg-3
continent-list(v-model="criteria.continentId" topLabel="Any" @update:modelValue="updateContinent")
- .col.col-xs-12.col-sm-6.col-lg-3
+ .col-xs-12.col-sm-6.col-lg-3
.form-floating
input.form-control(type="text" id="regionSearch" placeholder="(free-form text)" :value="criteria.region"
@input="updateValue('region', $event.target.value)")
label(for="regionSearch") Region
.form-text (free-form text)
- .col.col-xs-12.col-sm-6.col-offset-md-2.col-lg-3.col-offset-lg-0
+ .col-xs-12.col-sm-6.col-offset-md-2.col-lg-3.col-offset-lg-0
label.jjj-label Remote Work Opportunity?
br
.form-check.form-check-inline
@@ -24,13 +24,13 @@ form.container
input.form-check-input(type="radio" id="remoteNo" name="remoteWork" :checked="criteria.remoteWork === 'no'"
@click="updateValue('remoteWork', 'no')")
label.form-check-label(for="remoteNo") No
- .col.col-xs-12.col-sm-6.col-lg-3
+ .col-xs-12.col-sm-6.col-lg-3
.form-floating
input.form-control(type="text" id="textSearch" placeholder="(free-form text)" :value="criteria.text"
@input="updateValue('text', $event.target.value)")
label(for="textSearch") Job Listing Text
.form-text (free-form text)
- .row: .col.col-xs-12
+ .row: .col
br
button.btn.btn-outline-primary(type="submit" @click.prevent="$emit('search')") Search
diff --git a/src/JobsJobsJobs/App/src/components/layout/AppLinks.vue b/src/JobsJobsJobs/App/src/components/layout/AppLinks.vue
new file mode 100644
index 0000000..17d52f4
--- /dev/null
+++ b/src/JobsJobsJobs/App/src/components/layout/AppLinks.vue
@@ -0,0 +1,82 @@
+
+nav
+ template(v-if="isLoggedOn")
+ router-link(to="/citizen/dashboard" @click="hide") #[icon(:icon="mdiViewDashboardVariant")] Dashboard
+ router-link(to="/help-wanted" @click="hide") #[icon(:icon="mdiNewspaperVariantMultipleOutline")] Help Wanted!
+ router-link(to="/profile/search" @click="hide") #[icon(:icon="mdiViewListOutline")] Employment Profiles
+ router-link(to="/success-story/list" @click="hide") #[icon(:icon="mdiThumbUp")] Success Stories
+ .separator
+ router-link(to="/listings/mine" @click="hide") #[icon(:icon="mdiSignText")] My Job Listings
+ router-link(to="/citizen/profile" @click="hide") #[icon(:icon="mdiPencil")] My Employment Profile
+ .separator
+ router-link(to="/citizen/log-off" @click="hide") #[icon(:icon="mdiLogoutVariant")] Log Off
+ template(v-else)
+ router-link(to="/" @click="hide") #[icon(:icon="mdiHome")] Home
+ router-link(to="/profile/seeking" @click="hide") #[icon(:icon="mdiViewListOutline")] Job Seekers
+ router-link(to="/citizen/log-on" @click="hide") #[icon(:icon="mdiLoginVariant")] Log On
+ router-link(to="/how-it-works" @click="hide") #[icon(:icon="mdiHelpCircleOutline")] How It Works
+
+
+
+
+
diff --git a/src/JobsJobsJobs/App/src/components/layout/AppNav.vue b/src/JobsJobsJobs/App/src/components/layout/AppNav.vue
index 299bf6c..1e1814a 100644
--- a/src/JobsJobsJobs/App/src/components/layout/AppNav.vue
+++ b/src/JobsJobsJobs/App/src/components/layout/AppNav.vue
@@ -1,88 +1,41 @@
-aside.collapse.show.p-3
+#mobileMenu.offcanvas.offcanvas-end(v-if="showMobileMenu" tabindex="-1" aria-labelledby="mobileMenuLabel")
+ .offcanvas-header
+ h5#mobileMenuLabel Menu
+ button.btn-close.text-reset(type="button" data-bs-dismiss="offcanvas" aria-label="Close")
+ .offcanvas-body: app-links
+aside.collapse.show.p-3(v-else)
p.home-link.pb-3: router-link(to="/") Jobs, Jobs, Jobs
p
- nav
- template(v-if="isLoggedOn")
- router-link(to="/citizen/dashboard") #[icon(:icon="mdiViewDashboardVariant")] Dashboard
- router-link(to="/help-wanted") #[icon(:icon="mdiNewspaperVariantMultipleOutline")] Help Wanted!
- router-link(to="/profile/search") #[icon(:icon="mdiViewListOutline")] Employment Profiles
- router-link(to="/success-story/list") #[icon(:icon="mdiThumbUp")] Success Stories
- .separator
- router-link(to="/listings/mine") #[icon(:icon="mdiSignText")] My Job Listings
- router-link(to="/citizen/profile") #[icon(:icon="mdiPencil")] My Employment Profile
- .separator
- router-link(to="/citizen/log-off") #[icon(:icon="mdiLogoutVariant")] Log Off
- template(v-else)
- router-link(to="/") #[icon(:icon="mdiHome")] Home
- router-link(to="/profile/seeking") #[icon(:icon="mdiViewListOutline")] Job Seekers
- router-link(to="/citizen/log-on") #[icon(:icon="mdiLoginVariant")] Log On
- router-link(to="/how-it-works") #[icon(:icon="mdiHelpCircleOutline")] How It Works
+ app-links
diff --git a/src/JobsJobsJobs/App/src/components/layout/TitleBar.vue b/src/JobsJobsJobs/App/src/components/layout/TitleBar.vue
index 4c7fa0d..d566683 100644
--- a/src/JobsJobsJobs/App/src/components/layout/TitleBar.vue
+++ b/src/JobsJobsJobs/App/src/components/layout/TitleBar.vue
@@ -1,9 +1,9 @@
-nav.navbar.navbar-dark.mobile
+nav.navbar.navbar-dark(v-if="showMobileHeader")
span.navbar-text: router-link(to="/") Jobs, Jobs, Jobs
button.btn(data-bs-toggle="offcanvas" data-bs-target="#mobileMenu" aria-controls="mobileMenu")
icon(:icon="mdiMenu")
-nav.navbar.navbar-light.bg-light.wide
+nav.navbar.navbar-light.bg-light(v-else)
span
span.navbar-text.
(…and Jobs – #[audio-clip(clip="pelosi-jobs") Let’s Vote for Jobs!])
@@ -11,24 +11,28 @@ nav.navbar.navbar-light.bg-light.wide
diff --git a/src/JobsJobsJobs/App/src/components/profile/PublicSearchForm.vue b/src/JobsJobsJobs/App/src/components/profile/PublicSearchForm.vue
index de3a33f..552686b 100644
--- a/src/JobsJobsJobs/App/src/components/profile/PublicSearchForm.vue
+++ b/src/JobsJobsJobs/App/src/components/profile/PublicSearchForm.vue
@@ -1,15 +1,15 @@
form.container
.row
- .col.col-xs-12.col-sm-6.col-md-4.col-lg-3
+ .col-xs-12.col-sm-6.col-md-4.col-lg-3
continent-list(v-model="criteria.continentId" topLabel="Any" @update:modelValue="updateContinent")
- .col.col-xs-12.col-sm-6.col-md-4.col-lg-3
+ .col-xs-12.col-sm-6.col-md-4.col-lg-3
.form-floating
input.form-control.form-control-sm(type="text" id="region" placeholder="(free-form text)"
:value="criteria.region" @input="updateValue('region', $event.target.value)")
label(for="region") Region
.form-text (free-form text)
- .col.col-xs-12.col-sm-6.col-offset-md-2.col-lg-3.col-offset-lg-0
+ .col-xs-12.col-sm-6.col-offset-md-2.col-lg-3.col-offset-lg-0
label.jjj-label Seeking Remote Work?
br
.form-check.form-check-inline
@@ -24,13 +24,13 @@ form.container
input.form-check-input(type="radio" id="remoteNo" name="remoteWork" :checked="criteria.remoteWork === 'no'"
@click="updateValue('remoteWork', 'no')")
label.form-check-label(for="remoteNo") No
- .col.col-xs-12.col-sm-6.col-lg-3
+ .col-xs-12.col-sm-6.col-lg-3
.form-floating
input.form-control.form-control-sm(type="text" id="skillSearch" placeholder="(free-form text)"
:value="criteria.skill" @input="updateValue('skill', $event.target.value)")
label(for="skillSearch") Skill
.form-text (free-form text)
- .row: .col.col-xs-12
+ .row: .col
br
button.btn.btn-outline-primary(type="submit" @click.prevent="$emit('search')") Search
diff --git a/src/JobsJobsJobs/App/src/components/profile/SearchForm.vue b/src/JobsJobsJobs/App/src/components/profile/SearchForm.vue
index 2516cab..252fc9b 100644
--- a/src/JobsJobsJobs/App/src/components/profile/SearchForm.vue
+++ b/src/JobsJobsJobs/App/src/components/profile/SearchForm.vue
@@ -1,9 +1,9 @@
form.container
.row
- .col.col-xs-12.col-sm-6.col-md-4.col-lg-3
+ .col-xs-12.col-sm-6.col-md-4.col-lg-3
continent-list(v-model="criteria.continentId" topLabel="Any" @update:modelValue="updateContinent")
- .col.col-xs-12.col-sm-6.col-offset-md-2.col-lg-3.col-offset-lg-0
+ .col-xs-12.col-sm-6.col-offset-md-2.col-lg-3.col-offset-lg-0
label.jjj-label Seeking Remote Work?
br
.form-check.form-check-inline
@@ -18,19 +18,19 @@ form.container
input.form-check-input(type="radio" id="remoteNo" name="remoteWork" :checked="criteria.remoteWork === 'no'"
@click="updateValue('remoteWork', 'no')")
label.form-check-label(for="remoteNo") No
- .col.col-xs-12.col-sm-6.col-lg-3
+ .col-xs-12.col-sm-6.col-lg-3
.form-floating
input.form-control(type="text" id="skillSearch" placeholder="(free-form text)" :value="criteria.skill"
@input="updateValue('skill', $event.target.value)")
label(for="skillSearch") Skill
.form-text (free-form text)
- .col.col-xs-12.col-sm-6.col-lg-3
+ .col-xs-12.col-sm-6.col-lg-3
.form-floating
input.form-control(type="text" id="bioSearch" placeholder="(free-form text)" :value="criteria.bioExperience"
@input="updateValue('bioExperience', $event.target.value)")
label(for="bioSearch") Bio / Experience
.form-text (free-form text)
- .row: .col.col-xs-12
+ .row: .col
br
button.btn.btn-outline-primary(type="submit" @click.prevent="$emit('search')") Search
diff --git a/src/JobsJobsJobs/App/src/components/profile/SkillEdit.vue b/src/JobsJobsJobs/App/src/components/profile/SkillEdit.vue
index 5d3b3e2..11131b4 100644
--- a/src/JobsJobsJobs/App/src/components/profile/SkillEdit.vue
+++ b/src/JobsJobsJobs/App/src/components/profile/SkillEdit.vue
@@ -1,15 +1,15 @@
.row.pb-3
- .col.col-xs-2.col-md-1.align-self-center
+ .col-xs-2.col-md-1.align-self-center
button.btn.btn-sm.btn-outline-danger.rounded-pill(title="Delete" @click.prevent="$emit('remove')") −
- .col.col-xs-10.col-md-6
+ .col-xs-10.col-md-6
.form-floating
input.form-control(type="text" :id="`skillDesc${skill.id}`" maxlength="100"
placeholder="A skill (language, design technique, process, etc.)" :value="skill.description"
@input="updateValue('description', $event.target.value)")
label.jjj-label(:for="`skillDesc${skill.id}`") Skill
.form-text A skill (language, design technique, process, etc.)
- .col.col-xs-12.col-md-5
+ .col-xs-12.col-md-5
.form-floating
input.form-control(type="text" :id="`skillNotes${skill.id}`" maxlength="100"
placeholder="A further description of the skill (100 characters max)" :value="skill.notes"
diff --git a/src/JobsJobsJobs/App/vue.config.js b/src/JobsJobsJobs/App/vue.config.js
index d0dffbd..b80816b 100644
--- a/src/JobsJobsJobs/App/vue.config.js
+++ b/src/JobsJobsJobs/App/vue.config.js
@@ -2,5 +2,14 @@ module.exports = {
transpileDependencies: [
'vuetify'
],
- outputDir: '../Api/wwwroot'
+ outputDir: '../Api/wwwroot',
+ configureWebpack: {
+ module: {
+ rules: [{
+ test: /\.mjs$/,
+ include: /node_modules/,
+ type: "javascript/auto"
+ }]
+ }
+ }
}