Переглянути джерело

Adds display of notes to work order page.

Christopher Leggett 5 роки тому
батько
коміт
d92977a75b

+ 1 - 1
app/WorkOrder.php

@@ -20,5 +20,5 @@ class WorkOrder extends Model
     public function notes()
     {
         return $this->hasMany('App\WorkOrderNote', 'woid');
-    }
+    } 
 }

+ 171 - 5
public/js/app.js

@@ -2025,6 +2025,42 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/notes.vue?vue&type=script&lang=js&":
+/*!****************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/notes.vue?vue&type=script&lang=js& ***!
+  \****************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+  props: ['initialnotes', 'authusername'],
+  data: function data() {
+    return {
+      notes: this.initialnotes
+    };
+  }
+});
+
+/***/ }),
+
 /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/woinfo.vue?vue&type=script&lang=js&":
 /*!*****************************************************************************************************************************************************************!*\
   !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/woinfo.vue?vue&type=script&lang=js& ***!
@@ -48501,6 +48537,66 @@ render._withStripped = true
 
 
 
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/notes.vue?vue&type=template&id=73d141f4&":
+/*!********************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/notes.vue?vue&type=template&id=73d141f4& ***!
+  \********************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+  var _vm = this
+  var _h = _vm.$createElement
+  var _c = _vm._self._c || _h
+  return _c(
+    "ul",
+    { staticClass: "list-unstyled" },
+    _vm._l(this.notes, function(note) {
+      return _c(
+        "li",
+        { key: note.noteid, staticClass: "d-flex" },
+        [
+          _vm.authusername === note.noteuser || _vm.authusername === "admin"
+            ? [
+                _c("button", { staticClass: "btn btn-primary m-1 my-2" }, [
+                  _vm._v("Edit")
+                ]),
+                _vm._v(" "),
+                _c("button", { staticClass: "btn btn-danger m-1 my-2" }, [
+                  _vm._v("Delete")
+                ]),
+                _vm._v(" "),
+                _c("button", { staticClass: "btn btn-primary m-1 my-2" }, [
+                  _vm._v("Switch")
+                ])
+              ]
+            : _vm._e(),
+          _vm._v(" "),
+          _c("div", { staticClass: "card m-2 w-100" }, [
+            _c("div", { staticClass: "card-body p-2" }, [
+              _vm._v(
+                "\n                " + _vm._s(note.thenote) + "\n            "
+              )
+            ])
+          ])
+        ],
+        2
+      )
+    }),
+    0
+  )
+}
+var staticRenderFns = []
+render._withStripped = true
+
+
+
 /***/ }),
 
 /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/woinfo.vue?vue&type=template&id=33ce32de&":
@@ -48520,31 +48616,31 @@ var render = function() {
   var _c = _vm._self._c || _h
   return _c("div", [
     _c("p", [
-      _c("i", { staticClass: "fas fa-info-circle" }),
+      _c("i", { staticClass: "fas fa-fw fa-info-circle" }),
       _vm._v(" "),
       _c("span", { domProps: { textContent: _vm._s(this.data.probdesc) } })
     ]),
     _vm._v(" "),
     _c("p", [
-      _c("i", { staticClass: "far fa-lightbulb" }),
+      _c("i", { staticClass: "far fa-fw fa-lightbulb" }),
       _vm._v(" "),
       _c("span", { domProps: { textContent: _vm._s(this.data.suggested) } })
     ]),
     _vm._v(" "),
     _c("p", [
-      _c("i", { staticClass: "fas fa-paste" }),
+      _c("i", { staticClass: "fas fa-fw fa-paste" }),
       _vm._v(" "),
       _c("span", { domProps: { textContent: _vm._s(this.data.woid) } })
     ]),
     _vm._v(" "),
     _c("p", [
-      _c("i", { staticClass: "fas fa-building" }),
+      _c("i", { staticClass: "fas fa-fw fa-building" }),
       _vm._v(" "),
       _c("span", { domProps: { textContent: _vm._s(this.data.storeid) } })
     ]),
     _vm._v(" "),
     _c("p", [
-      _c("i", { staticClass: "fas fa-sign-in-alt" }),
+      _c("i", { staticClass: "fas fa-fw fa-sign-in-alt" }),
       _vm._v(" "),
       _c(
         "span",
@@ -60791,6 +60887,7 @@ Vue.component('example-component', __webpack_require__(/*! ./components/ExampleC
 Vue.component('woinfo', __webpack_require__(/*! ./components/woinfo.vue */ "./resources/js/components/woinfo.vue")["default"]);
 Vue.component('assetinfo', __webpack_require__(/*! ./components/assetinfo.vue */ "./resources/js/components/assetinfo.vue")["default"]);
 Vue.component('credential', __webpack_require__(/*! ./components/credential.vue */ "./resources/js/components/credential.vue")["default"]);
+Vue.component('notes', __webpack_require__(/*! ./components/notes.vue */ "./resources/js/components/notes.vue")["default"]);
 /**
  * Next, we will create a fresh Vue application instance and attach it to
  * the page. Then, you may begin adding components to this application
@@ -61069,6 +61166,75 @@ __webpack_require__.r(__webpack_exports__);
 
 
 
+/***/ }),
+
+/***/ "./resources/js/components/notes.vue":
+/*!*******************************************!*\
+  !*** ./resources/js/components/notes.vue ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _notes_vue_vue_type_template_id_73d141f4___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notes.vue?vue&type=template&id=73d141f4& */ "./resources/js/components/notes.vue?vue&type=template&id=73d141f4&");
+/* harmony import */ var _notes_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./notes.vue?vue&type=script&lang=js& */ "./resources/js/components/notes.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
+  _notes_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _notes_vue_vue_type_template_id_73d141f4___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _notes_vue_vue_type_template_id_73d141f4___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  false,
+  null,
+  null,
+  null
+  
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/notes.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/notes.vue?vue&type=script&lang=js&":
+/*!********************************************************************!*\
+  !*** ./resources/js/components/notes.vue?vue&type=script&lang=js& ***!
+  \********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_notes_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib??ref--4-0!../../../node_modules/vue-loader/lib??vue-loader-options!./notes.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/notes.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_notes_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+
+/***/ }),
+
+/***/ "./resources/js/components/notes.vue?vue&type=template&id=73d141f4&":
+/*!**************************************************************************!*\
+  !*** ./resources/js/components/notes.vue?vue&type=template&id=73d141f4& ***!
+  \**************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_notes_vue_vue_type_template_id_73d141f4___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./notes.vue?vue&type=template&id=73d141f4& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/notes.vue?vue&type=template&id=73d141f4&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_notes_vue_vue_type_template_id_73d141f4___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_notes_vue_vue_type_template_id_73d141f4___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
 /***/ }),
 
 /***/ "./resources/js/components/woinfo.vue":

+ 1 - 0
resources/js/app.js

@@ -26,6 +26,7 @@ Vue.component('example-component', require('./components/ExampleComponent.vue').
 Vue.component('woinfo', require('./components/woinfo.vue').default);
 Vue.component('assetinfo', require('./components/assetinfo.vue').default);
 Vue.component('credential', require('./components/credential.vue').default);
+Vue.component('notes', require('./components/notes.vue').default);
 
 /**
  * Next, we will create a fresh Vue application instance and attach it to

+ 26 - 0
resources/js/components/notes.vue

@@ -0,0 +1,26 @@
+<template>
+    <ul class="list-unstyled">
+        <li class="d-flex" v-bind:key="note.noteid" v-for="note in this.notes">
+            <template v-if="authusername === note.noteuser || authusername === 'admin'">
+                <button class="btn btn-primary m-1 my-2">Edit</button>
+                <button class="btn btn-danger m-1 my-2">Delete</button>
+                <button class="btn btn-primary m-1 my-2">Switch</button>
+            </template>
+            <div class="card m-2 w-100">
+                <div class="card-body p-2">
+                    {{ note.thenote }}
+                </div>
+            </div>
+        </li>
+    </ul>
+</template>
+<script>
+export default {
+    props: ['initialnotes', 'authusername'],
+    data () {
+        return {
+            notes: this.initialnotes
+        }
+    }
+}
+</script>

+ 5 - 5
resources/js/components/woinfo.vue

@@ -1,10 +1,10 @@
 <template>
     <div>
-        <p><i class="fas fa-info-circle"></i> <span v-text="this.data.probdesc"></span></p>
-        <p><i class="far fa-lightbulb"></i> <span v-text="this.data.suggested"></span></p>
-        <p><i class="fas fa-paste"></i> <span v-text="this.data.woid"></span></p>
-        <p><i class="fas fa-building"></i> <span v-text="this.data.storeid"></span></p>
-        <p><i class="fas fa-sign-in-alt"></i> 
+        <p><i class="fas fa-fw fa-info-circle"></i> <span v-text="this.data.probdesc"></span></p>
+        <p><i class="far fa-fw fa-lightbulb"></i> <span v-text="this.data.suggested"></span></p>
+        <p><i class="fas fa-fw fa-paste"></i> <span v-text="this.data.woid"></span></p>
+        <p><i class="fas fa-fw fa-building"></i> <span v-text="this.data.storeid"></span></p>
+        <p><i class="fas fa-fw fa-sign-in-alt"></i> 
             <span class="dashed-underline" data-toggle="tooltip" data-placement="bottom" v-bind:title=this.getHRDate(this.data.dropdate)>
                 {{ Math.floor(this.daysSinceToday(this.data.dropdate)) }} days ago
             </span>

+ 89 - 67
resources/views/workorders/show.blade.php

@@ -3,82 +3,104 @@
 @section('content')
 
 <div id="app">
-        <div class="row no-gutters">
-            <div class="col-lg-6">
-                <div class="card m-3">
-                    <div class="card-header text-right">
-                        <button type="button" class="btn btn-default xs-toggle" data-toggle="collapse" data-target="#assetTab">
-                            <span class="sr-only">Toggle Navigation</span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
-                        </button>
-                        <ul class="nav nav-pills card-header-pills nav-justified xs-collapse collapse" id="assetTab" role="tablist">
-                            <li class="nav-item">
-                                <a class="nav-link active" id="assetinfo-tab" data-toggle="pill" href="#assetinfo" role="tab" aria-controls="assetinfo" aria-selected="true">Hardware</a>
-                            </li>
-                            @if($workOrder->asset->group !== null)
-                            <li class="nav-item">
-                                <a class="nav-link" id="group-tab" data-toggle="pill" href="#group" role="tab" aria-controls="group" aria-selected="false">Group</a>
-                            </li>
-                            @endif
-                            <li class="nav-item">
-                                <a class="nav-link" id="credentials-tab" data-toggle="pill" href="#credentials" role="tab" aria-controls="credentials" aria-selected="false">Credentials</a>
-                            </li>
-                        </ul>
-                    </div>
-                    <div class="card-body">
-                        <div class="tab-content">
-                            <div class="tab-pane active" id="assetinfo" role="tabpanel" aria-labelledby="assetinfo-tab">
-                                <assetinfo asset="{{$workOrder->asset}}"></assetinfo>
-                                <a href="{{ route('editasset', ['asset' => $workOrder->asset]) }}" class="btn btn-primary">Edit</a>
-                            </div>
-                            @if($workOrder->asset->group !== null)
-                            <div class="tab-pane" id="group" role="tabpanel" aria-labelledby="group-tab">
-                                Name: {{$workOrder->asset->group->pcgroupname}}
-                            </div>
-                            @endif
-                            <div class="tab-pane" id="credentials" role="tabpanel" aria-labelledby="credentials-tab">
-                                @foreach ($workOrder->asset->credentials as $cred)
-                                    <credential credential="{{$cred}}"></credential>
-                                @endforeach
-                            </div>
+    <div class="container-fluid">
+    <div class="row my-3">
+        <div class="col-lg-6">
+            <div class="card h-100">
+                <div class="card-header text-right">
+                    <button type="button" class="btn btn-default xs-toggle" data-toggle="collapse" data-target="#assetTab">
+                        <span class="sr-only">Toggle Navigation</span>
+                        <span class="icon-bar"></span>
+                        <span class="icon-bar"></span>
+                        <span class="icon-bar"></span>
+                    </button>
+                    <ul class="nav nav-pills card-header-pills nav-justified xs-collapse collapse" id="assetTab" role="tablist">
+                        <li class="nav-item">
+                            <a class="nav-link active" id="assetinfo-tab" data-toggle="pill" href="#assetinfo" role="tab" aria-controls="assetinfo" aria-selected="true">Hardware</a>
+                        </li>
+                        @if($workOrder->asset->group !== null)
+                        <li class="nav-item">
+                            <a class="nav-link" id="group-tab" data-toggle="pill" href="#group" role="tab" aria-controls="group" aria-selected="false">Group</a>
+                        </li>
+                        @endif
+                        <li class="nav-item">
+                            <a class="nav-link" id="credentials-tab" data-toggle="pill" href="#credentials" role="tab" aria-controls="credentials" aria-selected="false">Credentials</a>
+                        </li>
+                    </ul>
+                </div>
+                <div class="card-body">
+                    <div class="tab-content">
+                        <div class="tab-pane active" id="assetinfo" role="tabpanel" aria-labelledby="assetinfo-tab">
+                            <assetinfo asset="{{$workOrder->asset}}"></assetinfo>
+                            <a href="{{ route('editasset', ['asset' => $workOrder->asset]) }}" class="btn btn-primary">Edit</a>
+                        </div>
+                        @if($workOrder->asset->group !== null)
+                        <div class="tab-pane" id="group" role="tabpanel" aria-labelledby="group-tab">
+                            Name: {{$workOrder->asset->group->pcgroupname}}
+                        </div>
+                        @endif
+                        <div class="tab-pane" id="credentials" role="tabpanel" aria-labelledby="credentials-tab">
+                            @foreach ($workOrder->asset->credentials as $cred)
+                                <credential credential="{{$cred}}"></credential>
+                            @endforeach
                         </div>
                     </div>
                 </div>
             </div>
-            <div class="col-lg-6">
-                <div class="card m-3 flex-fill">
-                    <div class="card-header text-right">
-                        <button type="button" class="btn btn-default xs-toggle" data-toggle="collapse" data-target="#workorderTab">
-                            <span class="sr-only">Toggle Navigation</span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
-                            <span class="icon-bar"></span>
-                        </button>
-                        <ul class="nav nav-pills card-header-pills nav-justified xs-collapse collapse" id="workorderTab" role="tablist">
-                            <li class="nav-item">
-                                <a class="nav-link active" id="workorderinfo-tab" data-toggle="pill" href="#workorderinfo" role="tab" aria-controls="workorderinfo" aria-selected="true">Work Order Info</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" id="attachments-tab" data-toggle="pill" href="#attachments" role="tab" aria-controls="attachments" aria-selected="false">Attachments</a>
-                            </li>
-                        </ul>
-                    </div>
-                    <div class='card-body'>
-                        <div class='tab-content'>
-                            <div class="tab-pane active" id="workorderinfo" role="tabpanel" aria-labelledby="workorderinfo-tab">
-                                <woinfo work-order="{{$workOrder}}"></woinfo>
-                                <a href="{{ route('editwo', ['workOrder' => $workOrder]) }}" class="btn btn-primary">Edit</a>
-                            </div>
-                            <div class="tab-pane" id="attachments" role="tabpanel" aria-labelledby="attachments-tab">
-                                TODO 2
-                            </div>
+        </div>
+        <div class="col-lg-6">
+            <div class="card h-100">
+                <div class="card-header text-right">
+                    <button type="button" class="btn btn-default xs-toggle" data-toggle="collapse" data-target="#workorderTab">
+                        <span class="sr-only">Toggle Navigation</span>
+                        <span class="icon-bar"></span>
+                        <span class="icon-bar"></span>
+                        <span class="icon-bar"></span>
+                    </button>
+                    <ul class="nav nav-pills card-header-pills nav-justified xs-collapse collapse" id="workorderTab" role="tablist">
+                        <li class="nav-item">
+                            <a class="nav-link active" id="workorderinfo-tab" data-toggle="pill" href="#workorderinfo" role="tab" aria-controls="workorderinfo" aria-selected="true">Work Order Info</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" id="attachments-tab" data-toggle="pill" href="#attachments" role="tab" aria-controls="attachments" aria-selected="false">Attachments</a>
+                        </li>
+                    </ul>
+                </div>
+                <div class='card-body'>
+                    <div class='tab-content'>
+                        <div class="tab-pane active" id="workorderinfo" role="tabpanel" aria-labelledby="workorderinfo-tab">
+                            <woinfo work-order="{{$workOrder}}"></woinfo>
+                            <a href="{{ route('editwo', ['workOrder' => $workOrder]) }}" class="btn btn-primary">Edit</a>
+                        </div>
+                        <div class="tab-pane" id="attachments" role="tabpanel" aria-labelledby="attachments-tab">
+                            TODO 2
                         </div>
                     </div>
                 </div>
             </div>
         </div>
+    </div>
+    <div class="row my-3 no-gutters">
+        <div class="col-12">
+            <div class="card">
+                <div class="card-body">
+                    <h5 class="card-title">Customer Notes</h5>
+                    <notes :initialnotes="{{$workOrder->notes->where('notetype', '0')}}" authusername="{{Auth::user()->username}}"></notes>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="row my-3 no-gutters">
+        <div class="col-12">
+            <div class="card">
+                <div class="card-body">
+                    <h5 class="card-title">Private/Billing Notes</h5>
+                    <notes :initialnotes="{{$workOrder->notes->where('notetype', '1')}}" authusername="{{Auth::user()->username}}"></notes>
+                </div>
+            </div>
+        </div>
+    </div>
+    </div>
 </div>
 
 @endsection