adding docker image.

adding cerner client.
adding new images
using yarn for npm package management.
This commit is contained in:
Jason Kulatunga 2022-09-21 18:57:38 -07:00
parent 342cfa740b
commit fa09bfafd6
20 changed files with 7972 additions and 25165 deletions

7
.dockerignore Normal file
View File

@ -0,0 +1,7 @@
/vendor
/.idea
/.github
/.git
/frontend/node_modules
/frontend/.angular
/dist

26
Dockerfile Normal file
View File

@ -0,0 +1,26 @@
FROM node:18.9.0 as frontend-build
WORKDIR /usr/src/fastenhealth/frontend
#COPY frontend/package.json frontend/yarn.lock ./
COPY frontend/package.json ./
RUN yarn install --frozen-lockfile
COPY frontend/ ./
RUN yarn run build -- --output-path=../dist
FROM golang:1.18 as backend-build
WORKDIR /go/src/github.com/fastenhealth/fastenhealth-onprem
COPY . .
RUN go mod vendor \
&& go install github.com/golang/mock/mockgen@v1.6.0 \
&& go generate ./... \
&& go vet ./... \
&& go test ./...
RUN CGO_ENABLED=0 go build -o /go/bin/fasten ./backend/cmd/fasten/
FROM gcr.io/distroless/static-debian11
COPY --from=frontend-build /usr/src/fastenhealth/dist /opt/fasten/dist
COPY --from=backend-build /go/bin/fasten /opt/fasten/fasten
COPY config.yaml /opt/fasten/config.yaml
CMD ["/opt/fasten/fasten"]

View File

@ -1,6 +1,5 @@
package pkg
//go:generate stringer -type=SourceType
// SourceType contains all the various medical, insurance, health care providers which Fasten can communicate with
type SourceType string
@ -10,10 +9,12 @@ const (
SourceTypeAetna SourceType = "aetna"
SourceTypeAnthem SourceType = "anthem"
SourceTypeCedarSinai SourceType = "cedarssinai"
SourceTypeCerner SourceType = "cerner"
SourceTypeCigna SourceType = "cigna"
SourceTypeCommonSpirit SourceType = "commonspirit"
SourceTypeDeltaDental SourceType = "deltadental"
SourceTypeDignityHealth SourceType = "dignityhealth"
SourceTypeEpic SourceType = "epic"
SourceTypeHCAHealthcare SourceType = "hcahealthcare"
SourceTypeHumana SourceType = "humana"
SourceTypeKaiser SourceType = "kaiser"

View File

@ -63,18 +63,107 @@ func (mr *MockDatabaseRepositoryMockRecorder) CreateSource(arg0, arg1 interface{
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSource", reflect.TypeOf((*MockDatabaseRepository)(nil).CreateSource), arg0, arg1)
}
// GetCurrentUser mocks base method.
func (m *MockDatabaseRepository) GetCurrentUser() models.User {
// CreateUser mocks base method.
func (m *MockDatabaseRepository) CreateUser(arg0 context.Context, arg1 *models.User) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetCurrentUser")
ret := m.ctrl.Call(m, "CreateUser", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// CreateUser indicates an expected call of CreateUser.
func (mr *MockDatabaseRepositoryMockRecorder) CreateUser(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateUser", reflect.TypeOf((*MockDatabaseRepository)(nil).CreateUser), arg0, arg1)
}
// GetCurrentUser mocks base method.
func (m *MockDatabaseRepository) GetCurrentUser(arg0 context.Context) models.User {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetCurrentUser", arg0)
ret0, _ := ret[0].(models.User)
return ret0
}
// GetCurrentUser indicates an expected call of GetCurrentUser.
func (mr *MockDatabaseRepositoryMockRecorder) GetCurrentUser() *gomock.Call {
func (mr *MockDatabaseRepositoryMockRecorder) GetCurrentUser(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentUser", reflect.TypeOf((*MockDatabaseRepository)(nil).GetCurrentUser))
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentUser", reflect.TypeOf((*MockDatabaseRepository)(nil).GetCurrentUser), arg0)
}
// GetPatientForSources mocks base method.
func (m *MockDatabaseRepository) GetPatientForSources(ctx context.Context) ([]models.ResourceFhir, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetPatientForSources", ctx)
ret0, _ := ret[0].([]models.ResourceFhir)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetPatientForSources indicates an expected call of GetPatientForSources.
func (mr *MockDatabaseRepositoryMockRecorder) GetPatientForSources(ctx interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPatientForSources", reflect.TypeOf((*MockDatabaseRepository)(nil).GetPatientForSources), ctx)
}
// GetResource mocks base method.
func (m *MockDatabaseRepository) GetResource(arg0 context.Context, arg1 string) (*models.ResourceFhir, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetResource", arg0, arg1)
ret0, _ := ret[0].(*models.ResourceFhir)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetResource indicates an expected call of GetResource.
func (mr *MockDatabaseRepositoryMockRecorder) GetResource(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResource", reflect.TypeOf((*MockDatabaseRepository)(nil).GetResource), arg0, arg1)
}
// GetResourceBySourceId mocks base method.
func (m *MockDatabaseRepository) GetResourceBySourceId(arg0 context.Context, arg1, arg2 string) (*models.ResourceFhir, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetResourceBySourceId", arg0, arg1, arg2)
ret0, _ := ret[0].(*models.ResourceFhir)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetResourceBySourceId indicates an expected call of GetResourceBySourceId.
func (mr *MockDatabaseRepositoryMockRecorder) GetResourceBySourceId(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResourceBySourceId", reflect.TypeOf((*MockDatabaseRepository)(nil).GetResourceBySourceId), arg0, arg1, arg2)
}
// GetSource mocks base method.
func (m *MockDatabaseRepository) GetSource(arg0 context.Context, arg1 string) (*models.Source, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetSource", arg0, arg1)
ret0, _ := ret[0].(*models.Source)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetSource indicates an expected call of GetSource.
func (mr *MockDatabaseRepositoryMockRecorder) GetSource(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSource", reflect.TypeOf((*MockDatabaseRepository)(nil).GetSource), arg0, arg1)
}
// GetSourceSummary mocks base method.
func (m *MockDatabaseRepository) GetSourceSummary(arg0 context.Context, arg1 string) (*models.SourceSummary, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetSourceSummary", arg0, arg1)
ret0, _ := ret[0].(*models.SourceSummary)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetSourceSummary indicates an expected call of GetSourceSummary.
func (mr *MockDatabaseRepositoryMockRecorder) GetSourceSummary(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSourceSummary", reflect.TypeOf((*MockDatabaseRepository)(nil).GetSourceSummary), arg0, arg1)
}
// GetSources mocks base method.
@ -92,30 +181,61 @@ func (mr *MockDatabaseRepositoryMockRecorder) GetSources(arg0 interface{}) *gomo
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSources", reflect.TypeOf((*MockDatabaseRepository)(nil).GetSources), arg0)
}
// UpsertOrganziation mocks base method.
func (m *MockDatabaseRepository) UpsertOrganziation(arg0 context.Context, arg1 *models.Organization) error {
// GetSummary mocks base method.
func (m *MockDatabaseRepository) GetSummary(ctx context.Context) (*models.Summary, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "UpsertOrganziation", arg0, arg1)
ret := m.ctrl.Call(m, "GetSummary", ctx)
ret0, _ := ret[0].(*models.Summary)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetSummary indicates an expected call of GetSummary.
func (mr *MockDatabaseRepositoryMockRecorder) GetSummary(ctx interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSummary", reflect.TypeOf((*MockDatabaseRepository)(nil).GetSummary), ctx)
}
// GetUserByEmail mocks base method.
func (m *MockDatabaseRepository) GetUserByEmail(arg0 context.Context, arg1 string) (*models.User, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetUserByEmail", arg0, arg1)
ret0, _ := ret[0].(*models.User)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetUserByEmail indicates an expected call of GetUserByEmail.
func (mr *MockDatabaseRepositoryMockRecorder) GetUserByEmail(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserByEmail", reflect.TypeOf((*MockDatabaseRepository)(nil).GetUserByEmail), arg0, arg1)
}
// ListResources mocks base method.
func (m *MockDatabaseRepository) ListResources(arg0 context.Context, arg1 models.ListResourceQueryOptions) ([]models.ResourceFhir, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListResources", arg0, arg1)
ret0, _ := ret[0].([]models.ResourceFhir)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListResources indicates an expected call of ListResources.
func (mr *MockDatabaseRepositoryMockRecorder) ListResources(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListResources", reflect.TypeOf((*MockDatabaseRepository)(nil).ListResources), arg0, arg1)
}
// UpsertResource mocks base method.
func (m *MockDatabaseRepository) UpsertResource(arg0 context.Context, arg1 models.ResourceFhir) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "UpsertResource", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// UpsertOrganziation indicates an expected call of UpsertOrganziation.
func (mr *MockDatabaseRepositoryMockRecorder) UpsertOrganziation(arg0, arg1 interface{}) *gomock.Call {
// UpsertResource indicates an expected call of UpsertResource.
func (mr *MockDatabaseRepositoryMockRecorder) UpsertResource(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertOrganziation", reflect.TypeOf((*MockDatabaseRepository)(nil).UpsertOrganziation), arg0, arg1)
}
// UpsertProfile mocks base method.
func (m *MockDatabaseRepository) UpsertProfile(arg0 context.Context, arg1 *models.Profile) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "UpsertProfile", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// UpsertProfile indicates an expected call of UpsertProfile.
func (mr *MockDatabaseRepositoryMockRecorder) UpsertProfile(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertProfile", reflect.TypeOf((*MockDatabaseRepository)(nil).UpsertProfile), arg0, arg1)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertResource", reflect.TypeOf((*MockDatabaseRepository)(nil).UpsertResource), arg0, arg1)
}

View File

@ -8,6 +8,7 @@ import (
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/config"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/aetna"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/base"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/cerner"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/cigna"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/logica"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/manual"
@ -26,6 +27,8 @@ func NewClient(sourceType pkg.SourceType, ctx context.Context, appConfig config.
sourceClient, updatedSource, err = aetna.NewClient(ctx, appConfig, globalLogger, credentials, testHttpClient...)
case pkg.SourceTypeAnthem:
sourceClient, updatedSource, err = cigna.NewClient(ctx, appConfig, globalLogger, credentials, testHttpClient...)
case pkg.SourceTypeCerner:
sourceClient, updatedSource, err = cerner.NewClient(ctx, appConfig, globalLogger, credentials, testHttpClient...)
case pkg.SourceTypeCigna:
sourceClient, updatedSource, err = cigna.NewClient(ctx, appConfig, globalLogger, credentials, testHttpClient...)
case pkg.SourceTypeLogica:

View File

@ -1,6 +1,7 @@
package base
import (
"context"
"encoding/json"
mock_config "github.com/fastenhealth/fastenhealth-onprem/backend/pkg/config/mock"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/models"
@ -9,6 +10,7 @@ import (
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
"io/ioutil"
"net/http"
"os"
"testing"
)
@ -35,10 +37,10 @@ func TestNewFHIR401Client(t *testing.T) {
})
//test
client, _, err := NewFHIR401Client(fakeConfig, testLogger, models.Source{
client, _, err := NewFHIR401Client(context.Background(), fakeConfig, testLogger, models.Source{
RefreshToken: "test-refresh-token",
AccessToken: "test-access-token",
})
}, &http.Client{})
//assert
require.NoError(t, err)
@ -55,10 +57,10 @@ func TestFHIR401Client_ProcessBundle(t *testing.T) {
testLogger := logrus.WithFields(logrus.Fields{
"type": "test",
})
client, _, err := NewFHIR401Client(fakeConfig, testLogger, models.Source{
client, _, err := NewFHIR401Client(context.Background(), fakeConfig, testLogger, models.Source{
RefreshToken: "test-refresh-token",
AccessToken: "test-access-token",
})
}, &http.Client{})
require.NoError(t, err)
jsonBytes, err := readTestFixture("testdata/fixtures/401-R4/bundle/cigna_syntheticuser05-everything.json")

View File

@ -5,6 +5,7 @@
package mock_base
import (
os "os"
reflect "reflect"
database "github.com/fastenhealth/fastenhealth-onprem/backend/pkg/database"
@ -61,3 +62,55 @@ func (mr *MockClientMockRecorder) SyncAll(db interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncAll", reflect.TypeOf((*MockClient)(nil).SyncAll), db)
}
// SyncAllBundle mocks base method.
func (m *MockClient) SyncAllBundle(db database.DatabaseRepository, bundleFile *os.File) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SyncAllBundle", db, bundleFile)
ret0, _ := ret[0].(error)
return ret0
}
// SyncAllBundle indicates an expected call of SyncAllBundle.
func (mr *MockClientMockRecorder) SyncAllBundle(db, bundleFile interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncAllBundle", reflect.TypeOf((*MockClient)(nil).SyncAllBundle), db, bundleFile)
}
// MockResourceInterface is a mock of ResourceInterface interface.
type MockResourceInterface struct {
ctrl *gomock.Controller
recorder *MockResourceInterfaceMockRecorder
}
// MockResourceInterfaceMockRecorder is the mock recorder for MockResourceInterface.
type MockResourceInterfaceMockRecorder struct {
mock *MockResourceInterface
}
// NewMockResourceInterface creates a new mock instance.
func NewMockResourceInterface(ctrl *gomock.Controller) *MockResourceInterface {
mock := &MockResourceInterface{ctrl: ctrl}
mock.recorder = &MockResourceInterfaceMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockResourceInterface) EXPECT() *MockResourceInterfaceMockRecorder {
return m.recorder
}
// ResourceRef mocks base method.
func (m *MockResourceInterface) ResourceRef() (string, *string) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ResourceRef")
ret0, _ := ret[0].(string)
ret1, _ := ret[1].(*string)
return ret0, ret1
}
// ResourceRef indicates an expected call of ResourceRef.
func (mr *MockResourceInterfaceMockRecorder) ResourceRef() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResourceRef", reflect.TypeOf((*MockResourceInterface)(nil).ResourceRef))
}

View File

@ -0,0 +1,45 @@
package cerner
import (
"context"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/config"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/database"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/hub/internal/fhir/base"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/models"
"github.com/sirupsen/logrus"
"net/http"
)
type CernerClient struct {
*base.FHIR401Client
}
func NewClient(ctx context.Context, appConfig config.Interface, globalLogger logrus.FieldLogger, source models.Source, testHttpClient ...*http.Client) (base.Client, *models.Source, error) {
baseClient, updatedSource, err := base.NewFHIR401Client(ctx, appConfig, globalLogger, source, testHttpClient...)
return CernerClient{
baseClient,
}, updatedSource, err
}
func (c CernerClient) SyncAll(db database.DatabaseRepository) error {
bundle, err := c.GetPatientBundle(c.Source.PatientId)
if err != nil {
return err
}
wrappedResourceModels, err := c.ProcessBundle(bundle)
if err != nil {
c.Logger.Infof("An error occurred while processing patient bundle %s", c.Source.PatientId)
return err
}
//todo, create the resources in dependency order
for _, apiModel := range wrappedResourceModels {
err = db.UpsertResource(context.Background(), apiModel)
if err != nil {
return err
}
}
return nil
}

View File

@ -11,6 +11,8 @@ func GetMetadataSource(c *gin.Context) {
metadataSource := map[string]models.MetadataSource{
string(pkg.SourceTypeLogica): {Display: "Logica (Sandbox)", SourceType: pkg.SourceTypeLogica, Category: []string{"Sandbox"}, Supported: true},
string(pkg.SourceTypeEpic): {Display: "Epic (Sandbox)", SourceType: pkg.SourceTypeEpic, Category: []string{"Sandbox"}, Supported: true},
string(pkg.SourceTypeCerner): {Display: "Cerner (Sandbox)", SourceType: pkg.SourceTypeCerner, Category: []string{"Sandbox"}, Supported: true},
// enabled
string(pkg.SourceTypeAetna): {Display: "Aetna", SourceType: pkg.SourceTypeAetna, Category: []string{"Insurance"}, Supported: true},

View File

@ -154,7 +154,7 @@ func RawRequestSource(c *gin.Context) {
foundSource, err := databaseRepo.GetSource(c, c.Param("sourceId"))
if err != nil {
logger.Errorln("An error occurred while finding source credential", err)
logger.Errorf("An error occurred while finding source credential: %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
@ -167,14 +167,14 @@ func RawRequestSource(c *gin.Context) {
client, updatedSource, err := hub.NewClient(foundSource.SourceType, c, nil, logger, *foundSource)
if err != nil {
logger.Errorf("Could not initialize source client", err)
logger.Errorf("Could not initialize source client %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
if updatedSource != nil {
err := databaseRepo.CreateSource(c, updatedSource)
if err != nil {
logger.Errorln("An error occurred while updating source credential", err)
logger.Errorf("An error occurred while updating source credential %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
@ -183,7 +183,7 @@ func RawRequestSource(c *gin.Context) {
var resp map[string]interface{}
err = client.GetRequest(strings.TrimSuffix(c.Param("path"), "/"), &resp)
if err != nil {
logger.Errorf("Error making raw request", err)
logger.Errorf("Error making raw request, %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}

25128
frontend/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -44,7 +44,7 @@
<div *ngFor="let sourceData of availableSourceList" (click)="connect($event, sourceData['source_type'])" class="col-sm-3 mg-b-20 px-3">
<div class="card h-100 d-flex align-items-center justify-content-center p-3 rounded-0 cursor-pointer">
<div class="card h-100 d-flex align-items-center justify-content-center p-3 rounded-0 cursor-pointer" [ngClass]="{'card-disable': !sourceData.enabled}">
<div class="card-body">
<img [src]="'assets/sources/'+sourceData['source_type']+'.png'" [alt]="metadataSources[sourceData['source_type']].display" class="img-fluid">

View File

@ -46,7 +46,7 @@ export class MedicalSourcesComponent implements OnInit {
let isConnected = false
for(const connectedSource of sourceList){
if(connectedSource.source_type == sourceType){
this.connectedSourceList.push({"source_type": sourceType, "display": this.metadataSources[sourceType]["display"]})
this.connectedSourceList.push({"source_type": sourceType, "display": this.metadataSources[sourceType]["display"], "enabled": this.metadataSources[sourceType]["enabled"]})
isConnected = true
break
}
@ -54,7 +54,7 @@ export class MedicalSourcesComponent implements OnInit {
if(!isConnected){
//this source has not been found in the connected list, lets add it to the available list.
this.availableSourceList.push({"source_type": sourceType, "display": this.metadataSources[sourceType]["display"]})
this.availableSourceList.push({"source_type": sourceType, "display": this.metadataSources[sourceType]["display"], "enabled": this.metadataSources[sourceType]["enabled"]})
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -4,6 +4,18 @@
cursor: pointer;
}
//disable card
.card-disable {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
background-color: lightgrey !important;
opacity: 0.5;
cursor: auto !important;
}
/* You can add global styles to this file, and also import other style files */
/*
* Azia v1.0.0 (https://www.bootstrapdash.com/demo/azia/v1.0/)

7664
frontend/yarn.lock Normal file

File diff suppressed because it is too large Load Diff